Учебники

VB.Net — Классы и объекты

Когда вы определяете класс, вы определяете план для типа данных. На самом деле это не определяет какие-либо данные, но определяет, что означает имя класса, то есть, из чего будет состоять объект класса и какие операции могут быть выполнены с таким объектом.

Объекты являются экземплярами класса. Методы и переменные, которые составляют класс, называются членами класса.

Определение класса

Определение класса начинается с ключевого слова Class, за которым следует имя класса; и тело класса, оканчивающееся оператором End Class. Ниже приводится общая форма определения класса —

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] [ Partial ] _
Class name [ ( Of typelist ) ]
   [ Inherits classname ]
   [ Implements interfacenames ]
   [ statements ]
End Class

Куда,

  • attributetelist — это список атрибутов, которые применяются к классу. Необязательный.

  • accessmodifier определяет уровни доступа к классу, он имеет значения как — Public, Protected, Friend, Protected Friend и Private. Необязательный.

  • Тени указывают, что переменная повторно объявляет и скрывает элемент с одинаковым именем или набор перегруженных элементов в базовом классе. Необязательный.

  • MustInherit указывает, что класс может использоваться только как базовый класс и что вы не можете создать объект непосредственно из него, то есть абстрактный класс. Необязательный.

  • NotInheritable указывает, что класс нельзя использовать в качестве базового класса.

  • Частичное указывает на частичное определение класса.

  • Inherits указывает базовый класс, от которого он наследуется.

  • Реализация определяет интерфейсы, от которых наследуется класс.

attributetelist — это список атрибутов, которые применяются к классу. Необязательный.

accessmodifier определяет уровни доступа к классу, он имеет значения как — Public, Protected, Friend, Protected Friend и Private. Необязательный.

Тени указывают, что переменная повторно объявляет и скрывает элемент с одинаковым именем или набор перегруженных элементов в базовом классе. Необязательный.

MustInherit указывает, что класс может использоваться только как базовый класс и что вы не можете создать объект непосредственно из него, то есть абстрактный класс. Необязательный.

NotInheritable указывает, что класс нельзя использовать в качестве базового класса.

Частичное указывает на частичное определение класса.

Inherits указывает базовый класс, от которого он наследуется.

Реализация определяет интерфейсы, от которых наследуется класс.

В следующем примере демонстрируется класс Box с тремя элементами данных: длина, ширина и высота.

Live Demo

Module mybox
   Class Box
      Public length As Double   ' Length of a box
      Public breadth As Double  ' Breadth of a box
      Public height As Double   ' Height of a box
   End Class
   Sub Main()
      Dim Box1 As Box = New Box()        ' Declare Box1 of type Box
      Dim Box2 As Box = New Box()        ' Declare Box2 of type Box
      Dim volume As Double = 0.0         ' Store the volume of a box here
      
      ' box 1 specification
      Box1.height = 5.0
      Box1.length = 6.0
      Box1.breadth = 7.0
      
      ' box 2 specification
      Box2.height = 10.0
      Box2.length = 12.0	
      Box2.breadth = 13.0
      
      'volume of box 1
      volume = Box1.height * Box1.length * Box1.breadth
      Console.WriteLine("Volume of Box1 : {0}", volume)
      
      'volume of box 2
      volume = Box2.height * Box2.length * Box2.breadth
      Console.WriteLine("Volume of Box2 : {0}", volume)
      Console.ReadKey()
   End Sub
End Module

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Volume of Box1 : 210
Volume of Box2 : 1560

Функции-члены и инкапсуляция

Функция-член класса — это функция, которая имеет свое определение или свой прототип в определении класса, как и любая другая переменная. Он работает с любым объектом класса, членом которого он является, и имеет доступ ко всем членам класса для этого объекта.

Переменные-члены — это атрибуты объекта (с точки зрения проектирования), и они остаются закрытыми для реализации инкапсуляции. Эти переменные могут быть доступны только с помощью открытых функций-членов.

Давайте изложим вышеупомянутые концепции, чтобы установить и получить значение различных членов класса в классе —

Live Demo

Module mybox
   Class Box
      Public length As Double    ' Length of a box
      Public breadth As Double   ' Breadth of a box
      Public height As Double    ' Height of a box
      Public Sub setLength(ByVal len As Double)
         length = len
      End Sub
      
      Public Sub setBreadth(ByVal bre As Double)
         breadth = bre
      End Sub
      
      Public Sub setHeight(ByVal hei As Double)
         height = hei
      End Sub
      
      Public Function getVolume() As Double
         Return length * breadth * height
      End Function
   End Class
   Sub Main()
      Dim Box1 As Box = New Box()        ' Declare Box1 of type Box
      Dim Box2 As Box = New Box()        ' Declare Box2 of type Box
      Dim volume As Double = 0.0         ' Store the volume of a box here

      ' box 1 specification
      Box1.setLength(6.0)
      Box1.setBreadth(7.0)
      Box1.setHeight(5.0)
      
      'box 2 specification
      Box2.setLength(12.0)
      Box2.setBreadth(13.0)
      Box2.setHeight(10.0)
      
      ' volume of box 1
      volume = Box1.getVolume()
      Console.WriteLine("Volume of Box1 : {0}", volume)

      'volume of box 2
      volume = Box2.getVolume()
      Console.WriteLine("Volume of Box2 : {0}", volume)
      Console.ReadKey()
   End Sub
End Module

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Volume of Box1 : 210
Volume of Box2 : 1560

Конструкторы и деструкторы

Конструктор класса — это специальный член Sub класса, который выполняется всякий раз, когда мы создаем новые объекты этого класса. Конструктор имеет имя New и не имеет никакого возвращаемого типа.

Следующая программа объясняет концепцию конструктора —

Live Demo

Class Line
   Private length As Double    ' Length of a line
   Public Sub New()   'constructor
      Console.WriteLine("Object is being created")
   End Sub
   
   Public Sub setLength(ByVal len As Double)
      length = len
   End Sub
     
   Public Function getLength() As Double
      Return length
   End Function
   Shared Sub Main()
      Dim line As Line = New Line()
      'set line length
      line.setLength(6.0)
      Console.WriteLine("Length of line : {0}", line.getLength())
      Console.ReadKey()
   End Sub
End Class

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Object is being created
Length of line : 6

Конструктор по умолчанию не имеет никаких параметров, но если вам нужно, конструктор может иметь параметры. Такие конструкторы называются параметризованными конструкторами . Этот метод помогает вам присвоить начальное значение объекту во время его создания, как показано в следующем примере:

Live Demo

Class Line
   Private length As Double    ' Length of a line
   Public Sub New(ByVal len As Double)   'parameterised constructor
      Console.WriteLine("Object is being created, length = {0}", len)
      length = len
   End Sub
   Public Sub setLength(ByVal len As Double)
      length = len
   End Sub
       
   Public Function getLength() As Double
      Return length
   End Function
   Shared Sub Main()
      Dim line As Line = New Line(10.0)
      Console.WriteLine("Length of line set by constructor : {0}", line.getLength())
      'set line length
      line.setLength(6.0)
      Console.WriteLine("Length of line set by setLength : {0}", line.getLength())
      Console.ReadKey()
   End Sub
End Class

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Object is being created, length = 10
Length of line set by constructor : 10
Length of line set by setLength : 6

Деструктор — это специальный член Sub класса, который выполняется всякий раз, когда объект его класса выходит из области видимости.

Деструктор имеет имя Finalize и не может ни возвращать значение, ни принимать какие-либо параметры. Деструктор может быть очень полезен для освобождения ресурсов перед выходом из программы, таких как закрытие файлов, освобождение памяти и т. Д.

Деструкторы не могут быть унаследованы или перегружены.

Следующий пример объясняет понятие деструктора —

Live Demo

Class Line
   Private length As Double    ' Length of a line
   Public Sub New()   'parameterised constructor
      Console.WriteLine("Object is being created")
   End Sub
   
   Protected Overrides Sub Finalize()  ' destructor
      Console.WriteLine("Object is being deleted")
   End Sub
   
   Public Sub setLength(ByVal len As Double)
      length = len
   End Sub
   
   Public Function getLength() As Double
      Return length
   End Function
   
   Shared Sub Main()
      Dim line As Line = New Line()
      'set line length
      line.setLength(6.0)
      Console.WriteLine("Length of line : {0}", line.getLength())
      Console.ReadKey()
   End Sub
End Class

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Object is being created
Length of line : 6
Object is being deleted

Общие члены класса VB.Net

Мы можем определить членов класса как статические, используя ключевое слово Shared. Когда мы объявляем члена класса как Shared, это означает, что независимо от того, сколько объектов класса создано, существует только одна копия члена.

Ключевое слово Shared подразумевает, что для класса существует только один экземпляр члена. Общие переменные используются для определения констант, потому что их значения могут быть получены путем вызова класса без создания его экземпляра.

Общие переменные могут быть инициализированы вне определения функции-члена или класса. Вы также можете инициализировать общие переменные внутри определения класса.

Вы также можете объявить функцию-член как Shared. Такие функции могут получить доступ только к общим переменным. Общие функции существуют еще до создания объекта.

В следующем примере демонстрируется использование общих членов —

Live Demo

Class StaticVar
   Public Shared num As Integer
   Public Sub count()
      num = num + 1
   End Sub
   Public Shared Function getNum() As Integer
      Return num
   End Function
   Shared Sub Main()
      Dim s As StaticVar = New StaticVar()
      s.count()
      s.count()
      s.count()
      Console.WriteLine("Value of variable num: {0}", StaticVar.getNum())
      Console.ReadKey()
   End Sub
End Class

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Value of variable num: 3

наследование

Одним из наиболее важных понятий в объектно-ориентированном программировании является наследование. Наследование позволяет нам определять класс в терминах другого класса, что облегчает создание и поддержку приложения. Это также дает возможность повторно использовать функциональность кода и быстрое время реализации.

При создании класса, вместо того, чтобы писать совершенно новые члены-данные и функции-члены, программист может указать, что новый класс должен наследовать члены существующего класса. Этот существующий класс называется базовым классом, а новый класс называется производным классом.

Базовые и производные классы

Класс может быть производным от нескольких классов или интерфейсов, что означает, что он может наследовать данные и функции от нескольких базовых классов или интерфейсов.

Синтаксис, используемый в VB.Net для создания производных классов, выглядит следующим образом:

<access-specifier> Class <base_class>
...
End Class
Class <derived_class>: Inherits <base_class>
...
End Class

Рассмотрим базовый класс Shape и его производный класс Rectangle —

Live Demo

' Base class
Class Shape
   Protected width As Integer
   Protected height As Integer
   Public Sub setWidth(ByVal w As Integer)
      width = w
   End Sub
   Public Sub setHeight(ByVal h As Integer)
      height = h
   End Sub
End Class
' Derived class
Class Rectangle : Inherits Shape
   Public Function getArea() As Integer
      Return (width * height)
   End Function
End Class
Class RectangleTester
   Shared Sub Main()
      Dim rect As Rectangle = New Rectangle()
      rect.setWidth(5)
      rect.setHeight(7)
      ' Print the area of the object.
      Console.WriteLine("Total area: {0}", rect.getArea())
      Console.ReadKey()
   End Sub	
End Class

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Total area: 35

Инициализация базового класса

Производный класс наследует переменные-члены базового класса и методы-члены. Следовательно, объект суперкласса должен быть создан до создания подкласса. Суперкласс или базовый класс неявно известен как MyBase в VB.Net

Следующая программа демонстрирует это —

Live Demo

' Base class
Class Rectangle
   Protected width As Double
   Protected length As Double
   Public Sub New(ByVal l As Double, ByVal w As Double)
      length = l
      width = w
   End Sub
   Public Function GetArea() As Double
      Return (width * length)
   End Function
   Public Overridable Sub Display()
      Console.WriteLine("Length: {0}", length)
      Console.WriteLine("Width: {0}", width)
      Console.WriteLine("Area: {0}", GetArea())
   End Sub
   'end class Rectangle  
End Class

'Derived class
Class Tabletop : Inherits Rectangle
   Private cost As Double
   Public Sub New(ByVal l As Double, ByVal w As Double)
      MyBase.New(l, w)
   End Sub
   Public Function GetCost() As Double
      Dim cost As Double
      cost = GetArea() * 70
      Return cost
   End Function
   Public Overrides Sub Display()
      MyBase.Display()
      Console.WriteLine("Cost: {0}", GetCost())
   End Sub
    'end class Tabletop
End Class
Class RectangleTester
   Shared Sub Main()
      Dim t As Tabletop = New Tabletop(4.5, 7.5)
      t.Display()
      Console.ReadKey()
   End Sub
End Class

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Length: 4.5
Width: 7.5
Area: 33.75
Cost: 2362.5

VB.Net поддерживает множественное наследование.