Szukaj…


Definiowanie klasy

Klasy są istotnymi aspektami OOP. Klasa jest jak „plan” obiektu. Obiekt ma właściwości klasy, ale właściwości nie są zdefiniowane w samej klasie. Ponieważ każdy obiekt może być inny, definiują one swoje własne cechy.

Public Class Person
End Class
 
Public Class Customer
End Class

Klasa może także zawierać podklasy . Podklasa dziedziczy te same właściwości i zachowania co klasa nadrzędna, ale może mieć własne unikalne właściwości i klasy.

Modyfikatory dziedziczenia (w klasach)

Dziedziczy

Określa klasę podstawową (lub macierzystą)

Public Class Person
End Class

Public Class Customer
    Inherits Person

End Class

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

Możliwe obiekty:

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

Nie odziedziczony

Uniemożliwia programistom korzystanie z tej klasy jako klasy podstawowej.

Public NotInheritable Class Person
End Class

Możliwe obiekty:

Dim p As New Person

MustInherit

Określa, że klasa jest przeznaczona wyłącznie do użytku jako klasa podstawowa. (Klasa abstrakcyjna)

Public MustInherit Class Person
End Class

Public Class Customer
    Inherits Person
End Class

Możliwe obiekty:

Dim c As New Customer

Modyfikatory dziedziczenia (dotyczące właściwości i metod)

Przesłonięty

Umożliwia zastąpienie właściwości lub metody w klasie w klasie pochodnej.

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

Zastępuje

Przesłania właściwość Overridable lub metodę zdefiniowaną w klasie bazowej.

Public Class Customer
    Inherits Person

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

NotOverridable

Zapobiega zastąpieniu właściwości lub metody w klasie dziedziczącej. Domyślne zachowanie. Można zadeklarować tylko w przypadku metod zastępowania

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

Przykładowe użycie:

Dim p As New Person
p.DoSomething()

Dim c As New Customer
c.DoSomething()

Dim d As New DetailedCustomer
d.DoSomething()

Wynik:

Person
Customer
Customer

MustOverride

Wymaga, aby klasa pochodna przesłaniała właściwość lub metodę.

Metody MustOverride muszą być zadeklarowane w klasach 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

Przykładowe użycie:

Dim c As New Customer
c.DoSomething()

Wynik:

Customer

MyBase

Słowo kluczowe MyBase zachowuje się jak zmienna obiektowa, która odnosi się do klasy bazowej bieżącego wystąpienia klasy.

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

Przykład użycia:

Dim p As New Person
p.DoSomething()

Console.WriteLine("----")

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

Wynik:

Person
----
Person
Person

Ja vs MyClass

Ja używa bieżącej instancji obiektu.

MyClass używa definicji członka w klasie, w której członek jest wywoływany

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

Przykładowe użycie:

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

Wynik:

Customer
Person

Przeciążenie

Przeciążenie to utworzenie więcej niż jednej procedury, konstruktora instancji lub właściwości w klasie o tej samej nazwie, ale różnych typach argumentów.

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

Cienie

Ponownie deklaruje członka, którego nie można zastąpić. Wpłynie to tylko na połączenia z instancją. Nie będzie to miało wpływu na kod wewnątrz klas podstawowych.

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

Przykładowe użycie:

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

Wynik:

Person
Person
----
Person
Customer

Pułapki :

Przykład 1, Tworzenie nowego obiektu za pomocą ogólnego. Jaka funkcja zostanie użyta?

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

przykładowe użycie:

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

Wynik: intuicyjnie wynik powinien być taki sam. To jednak nie jest prawda.

Person
Student
----
Person
Person

Przykład 2:

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

Wyjście: intuicyjnie można by pomyśleć, że p i s są równe i będą zachowywać się równe. To jednak nie jest prawda.

Person
Student

W tych prostych przykładach łatwo jest nauczyć się dziwnego zachowania Cieni. Ale w prawdziwym życiu przynosi wiele niespodzianek. Wskazane jest, aby nie używać cieni. Należy w miarę możliwości korzystać z innych alternatyw (przesłonięcia itp.)

Interfejsy

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow