Visual Basic .NET Language
OOP Słowa kluczowe
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