Поиск…


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

Классы являются жизненно важными аспектами ООП. Класс похож на «план» объекта. Объект имеет свойства класса, но характеристики не определены внутри самого класса. Поскольку каждый объект может быть другим, они определяют свои собственные характеристики.

Public Class Person
End Class
 
Public Class Customer
End Class

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

Модификаторы наследования (по классам)

Inherits

Задает базовый (или родительский) класс

Public Class Person
End Class

Public Class Customer
    Inherits Person

End Class

'One line notation
Public Class Student : Inherits Person
End Class

Возможные объекты:

Dim p As New Person
Dim c As New Customer
Dim s As New Student

NotInheritable

Запрещает программистам использовать класс в качестве базового класса.

Public NotInheritable Class Person
End Class

Возможные объекты:

Dim p As New Person

MustInherit

Указывает, что класс предназначен только для базового класса. (Аннотация класс)

Public MustInherit Class Person
End Class

Public Class Customer
    Inherits Person
End Class

Возможные объекты:

Dim c As New Customer

Модификаторы наследования (по свойствам и методам)

Overridable

Позволяет переопределить свойство или метод в классе в производном классе.

Public Class Person
    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub
End Class

Переопределение

Переопределяет свойство или метод Overridable, определенный в базовом классе.

Public Class Customer
    Inherits Person

    'Base Class must be Overridable
    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub
End Class

NotOverridable

Предотвращает переопределение свойства или метода в наследующем классе. Поведение по умолчанию. Может быть объявлен только при переопределении методов

Public Class Person

    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub

End Class

Public Class Customer
    Inherits Person

    Public NotOverridable Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

Public Class DetailedCustomer
    Inherits Customer

    'DoSomething can't be overridden
End Class

Пример использования:

Dim p As New Person
p.DoSomething()

Dim c As New Customer
c.DoSomething()

Dim d As New DetailedCustomer
d.DoSomething()

Выход:

Person
Customer
Customer

MustOverride

Требуется, чтобы производный класс переопределил свойство или метод.

Методы MustOverride должны быть объявлены в классах MustInherit.

Public MustInherit Class Person

    Public MustOverride Sub DoSomething()
    'No method definition here

End Class

Public Class Customer
    Inherits Person

    'DoSomething must be overridden
    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

Пример использования:

Dim c As New Customer
c.DoSomething()

Выход:

Customer

MyBase

Ключевое слово MyBase ведет себя как переменная объекта, относящаяся к базовому классу текущего экземпляра класса.

Public Class Person
    Public Sub DoSomething()
        Console.WriteLine("Person")
    End Sub
End Class

Public Class Customer
    Inherits Person

    Public Sub DoSomethingElse()
        MyBase.DoSomething()
    End Sub

End Class

Пример использования:

Dim p As New Person
p.DoSomething()

Console.WriteLine("----")

Dim c As New Customer
c.DoSomething()
c.DoSomethingElse()

Выход:

Person
----
Person
Person

Me vs MyClass

Me использует экземпляр текущего объекта.

MyClass использует членное определение в классе, где вызван элемент

Class Person
    Public Overridable Sub DoSomething()
        Console.WriteLine("Person")
    End Sub

    Public Sub useMe()
        Me.DoSomething()
    End Sub

    Public Sub useMyClass()
        MyClass.DoSomething()
    End Sub
End Class

Class Customer
    Inherits Person

    Public Overrides Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub
End Class

Пример использования:

Dim c As New Customer
c.useMe()
c.useMyClass()

Выход:

Customer
Person

перегрузка

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

Class Person
    Overloads Sub Display(ByVal theChar As Char)
        ' Add code that displays Char data.
    End Sub

    Overloads Sub Display(ByVal theInteger As Integer)
        ' Add code that displays Integer data.
    End Sub

    Overloads Sub Display(ByVal theDouble As Double)
        ' Add code that displays Double data.
    End Sub
End Class

Тени

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

Public Class Person
    Public Sub DoSomething()
        Console.WriteLine("Person")
    End Sub


    Public Sub UseMe()
        Me.DoSomething()
    End Sub
End Class
Public Class Customer
    Inherits Person
    Public Shadows Sub DoSomething()
        Console.WriteLine("Customer")
    End Sub

End Class

Пример использования:

Dim p As New Person
Dim c As New Customer
p.UseMe()
c.UseMe()
Console.WriteLine("----")
p.DoSomething()
c.DoSomething()

Выход:

Person
Person
----
Person
Customer

Ловушки :

Пример 1. Создание нового объекта через общий. Какая функция будет использоваться?

Public Sub CreateAndDoSomething(Of T As {Person, New})()
    Dim obj As New T
    obj.DoSomething()
End Sub

пример использования:

Dim p As New Person
p.DoSomething()
Dim s As New Student
s.DoSomething()
Console.WriteLine("----")
CreateAndDoSomething(Of Person)()
CreateAndDoSomething(Of Student)()

Результат: по интуиции результат должен быть таким же. Но это не так.

Person
Student
----
Person
Person

Пример 2:

Dim p As Person
Dim s As New Student
p = s
p.DoSomething()
s.DoSomething()

Результат. По интуиции вы можете думать, что p и s равны и будут вести себя одинаково. Но это не так.

Person
Student

В этих простых примерах легко узнать странное поведение Shadows. Но в реальной жизни это приносит много сюрпризов. Целесообразно предотвратить использование теней. Следует использовать как можно больше другие альтернативы (переопределения и т. Д.)

Интерфейсы

Public Interface IPerson
    Sub DoSomething()
End Interface

Public Class Customer
    Implements IPerson
    Public Sub DoSomething() Implements IPerson.DoSomething
        Console.WriteLine("Customer")
    End Sub

End Class


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow