Copyright © 2017, mgr inż. Jacek Jusis, mgr inż. Janusz Bonarowski 1 Polimorfizm – pola
Polimorfizm - w informatyce pojęcie dla określenia różnych sposobów zachowania się metody o tej samej nazwie w zależności od obiektu, na którym jest wykonywana. Polimorfizm wiąże się ściśle z dziedziczeniem.
Zadanie
Klasa bazowa
Utworzymy klasę bazową Figura. Klasa bazowa niech będzie klasa abstrakcyjną, czyli bez treści; można o niej myśleć np. jak o „nagłówku”. To, że ta klasa nic nie robi i musi mieć klasy potomne - definiuje atrybut klasy MustInherit.
Klasa bazowa niech posiada metodę (wykorzystajmy funkcję zamiast Sub, bo prościej) o nazwie Pole().
Metoda ta nie będzie miała treści zatem musi być nadpisana metodą o tej samej nazwie w klasie potomnej.
Stąd metoda ta musi mieć atrybut MustOverride, a ona sama nie ma treści.
Gdybyśmy zamierzali tworzyć właściwości (Properties), a nie tylko konstruktory, to w klasie bazowej należy zadeklarować właściwość z atrybutem MustOverride (tak jak metodę).
'Klasa bazowa (abstrakcyjna) z deklaracją metody i właściwości Public MustInherit Class Figura
Public MustOverride Function Pole() As Single 'Nawet nie ma End Function Public MustOverride Property Wymiar As Single 'Trzeba zadeklarować
' z MustOverride, skoro dopiero w potomnej jest tworzona.
End Class
Klasy potomne
Utwórzmy klasy potomne: Kolo i Kwadrat, które dziedziczą po klasie bazowej Figura (co definiuje wiersz Inherits Figura ).
Przez to, że w klasie bazowej zadeklarowaliśmy Property Wymiar z atrybytem MustOverride – w klasach potomnych musi pojawić się kod właściowsci z atrybutem Overrides: Public Overrides Property ...
Mając zdefiniowaną właściwość możemy na tym poprzestać co spowoduje, że w instancji klasy będziemy określać właściwość instrukcją podstawienia: mojaFigura.Wymiar = CSng(TextBoxPromien.Text), w przypadku klasy Kolo.
Możemy jednaj także dodać do klasy potomnej konstruktor i określać potrzebną nam właściwość za pomocą konstruktora: mojaFigura = New Kwadrat(CSng(TextBoxBok.Text)), przypadku klasy Kwadrat.
Konstruktor to procedura Sub koniecznie o nazwie New. Procedura ta może mieć argumenty. W naszym przypadku będzie ona miała jeden argument.
Rysunek 1. Aplikacjia w działaniu
Copyright © 2017, mgr inż. Jacek Jusis, mgr inż. Janusz Bonarowski 2 Class1.vb
Public MustInherit Class Figura 'Klasa abstrakcyjna
Public MustOverride Function Pole() As Single 'Nawet nie ma End Function
Public MustOverride Property Wymiar As Single 'Tu trzeba zadeklarować z MustOverride, 'skoro właściwość w potomnej jest tworzona.
End Class
Public Class Kolo Inherits Figura
Private _Promien As Single
Public Overrides Property Wymiar As Single 'Skoro w klasie bazowej właściwość Get 'ma nazwę Wymiar – w klasach potomnych Return _Promien 'też musi mieć nazwę Wymiar.
End Get 'może jednak zwracać _Promien lub _Bok.
Set(value As Single) _Promien = value End Set
End Property
Public Overrides Function Pole() As Single Return Math.PI * _Promien ^ 2
End Function End Class
Public Class Kwadrat Inherits Figura
Private _Bok As Single
Public Overrides Property Wymiar As Single Get
Return _Bok End Get
Set(value As Single) _Bok = value End Set
End Property
'Zamiast właściwością, jak w klasie Kolo można określać element konstruktorem.
Sub New(Bok_kwadratu As Single) 'konstruktor, zdefiniujemy Kwadrat(bok) _Bok = Bok_kwadratu
End Sub
Public Overrides Function Pole() As Single Return _Bok ^ 2
End Function End Class
Form1.vb
Public Class Form1
Private Sub ButtonOblicz_Click(sender As Object, e As EventArgs) _
Handles ButtonOblicz.Click Dim mojaFigura As Figura
mojaFigura = New Kolo 'tworzymy obiekt
mojaFigura.Wymiar = CSng(TextBoxPromien.Text) 'korzystamy z właściwości TextBoxPoleKola.Text = CStr(mojaFigura.Pole) 'korzystamy z metody
mojaFigura = New Kwadrat(CSng(TextBoxBok.Text)) 'tworzymy obiekt i korzystamy 'z konstruktora
TextBoxPoleKwadratu.Text = CStr(mojaFigura.Pole) 'korzystamy z metody End Sub
End Class