Когда вы определяете класс, вы определяете план для типа данных. На самом деле это не определяет какие-либо данные, но определяет, что означает имя класса, то есть, из чего будет состоять объект класса и какие операции могут быть выполнены с таким объектом.
Объекты являются экземплярами класса. Методы и переменные, которые составляют класс, называются членами класса.
Определение класса
Определение класса начинается с ключевого слова 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 с тремя элементами данных: длина, ширина и высота.
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
Функции-члены и инкапсуляция
Функция-член класса — это функция, которая имеет свое определение или свой прототип в определении класса, как и любая другая переменная. Он работает с любым объектом класса, членом которого он является, и имеет доступ ко всем членам класса для этого объекта.
Переменные-члены — это атрибуты объекта (с точки зрения проектирования), и они остаются закрытыми для реализации инкапсуляции. Эти переменные могут быть доступны только с помощью открытых функций-членов.
Давайте изложим вышеупомянутые концепции, чтобы установить и получить значение различных членов класса в классе —
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 и не имеет никакого возвращаемого типа.
Следующая программа объясняет концепцию конструктора —
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
Конструктор по умолчанию не имеет никаких параметров, но если вам нужно, конструктор может иметь параметры. Такие конструкторы называются параметризованными конструкторами . Этот метод помогает вам присвоить начальное значение объекту во время его создания, как показано в следующем примере:
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 и не может ни возвращать значение, ни принимать какие-либо параметры. Деструктор может быть очень полезен для освобождения ресурсов перед выходом из программы, таких как закрытие файлов, освобождение памяти и т. Д.
Деструкторы не могут быть унаследованы или перегружены.
Следующий пример объясняет понятие деструктора —
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. Такие функции могут получить доступ только к общим переменным. Общие функции существуют еще до создания объекта.
В следующем примере демонстрируется использование общих членов —
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 —
' 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
Следующая программа демонстрирует это —
' 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 поддерживает множественное наследование.