2_polimorfizm(3_wersje)
Tylko Właściwości
Zadanie
Utworzyć aplikację obliczającą pola 2 figur: kwadratu i koła.
Zadanie rozwiążemy wykorzystując metodę Pole w sposób polimorficzny.
Rozpoczynamy od utworzenia klasy Figura – chcemy, aby miała 2 klasy potomne: Kolo i Kwadrat.
Chcemy, aby klasa bazowa była klasą abstrakcyjną (stąd atrybut MustInherit).
Kod klasy abstrakcyjnej Figura
PublicMustInherit
Class Figura 'Klasa abstrakcyjnaPublic
MustOverride
Function Pole() As Single PublicMustOverride
Property Wymiar As Single End ClassProszę zwrócić uwagę, że właściwości nadajemy nazwę Wymiar, nazwę ogólną, uniwersalną – wymiarem może być zarówno promień koła jak i bok kwadratu. Treść (kod) funkcji i treść (kod) właściwości będą nakrywane przez odpowiednie definicje funkcji i właściwość w klasach potomnych, stąd przy obu dajemy atrybut MustOverride.
Po zbudowaniu klasy bazowej – budujemy klasę potomną Kolo:
Public Class Kolo Inherits Figura
Po wpisaniu wiersza
Inherits Figuraśrodowisko VB samo wygeneruje szkielety właściwości i funkcji zachowując ich nazwy z klasy bazowej i z odpowiednimi atrybutami
Overrides(zastąpienie). Właściwość i funkcja w klasie potomnej zastąpią zasygnalizowane tylko w klasie bazowej właściwość i funkcję.
Public Overrides Property Wymiar As Single
GetThrow New NotImplementedException() End Get
Set(value As Single)
Throw New NotImplementedException() End Set
End Property
Public Overrides Function Pole() As Single
Throw New NotImplementedException()End Function End Class
Poprawmy treść klasy potomnej Kolo: dodajmy zmienną wewnętrzną _Promien i dopiszmy kody właściwości i funkcji, usuwając też zbędne wiersze.
Kod klas potomnych
Public Class Kolo Inherits FiguraPrivate _Promien As Single
Public Overrides Property Wymiar As Single Get
Return _Promien End Get
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
Identycznie budujemy klasę potomną Kwadrat
Public Class KwadratInherits 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
Public Overrides Function Pole() As Single Return _Bok ^ 2
End Function End Class
Kod formularz
Public Class Form1Private Sub ButtonOblicz_Click(sender As Object, e As EventArgs) _
Handles ButtonOblicz.Click Dim MojaFigura As Figura 'Deklarujemy zmienną na obiekt klasy Figura MojaFigura = New Kolo 'Tworzymy obiekt MojaFigura jako Koło
MojaFigura.Wymiar = CSng(TextBoxPromien.Text) 'Nadajemy właściwość TextBoxPoleKola.Text = CStr(MojaFigura.Pole) 'Wywołujemy funkcję ' A jeśli powiemy, że MojaFigura to Kwadrat:
MojaFigura = New Kwadrat 'Tworzymy obiekt MojaFigura jako Kwadrat MojaFigura.Wymiar = CSng(TextBoxBok.Text) 'Nadajemy właściwość TextBoxPoleKwadratu.Text = CStr(MojaFigura.Pole) 'Wywołujemy funkcję End Sub
End Class
Tylko Konstruktory
Zadanie
Utworzyć aplikację obliczającą pola 2 figur: kwadratu i koła.
Zadanie rozwiązać wykorzystując metodę Pole w sposób polimorficzny.
Utworzymy klasę bazową Figura. Będzie to klasa abstrakcyjna (stąd atrybut MustInherit).
Niech ta klasa ma metodę abstrakcyjną Pole (stąd atrybut
MustOverride), a nie ma właściwości.
Niech klasa ta ma dwie klasy potomne Kolo i Kwadrat. Obie klasy potomne mają metodę Pole.
Ponieważ klasa bazowa nie posiada Właściwości, to i w polimorficznej pracy z obiektami potomnymi bezcelowe jest budowanie w nich Właściwości (Properties), bo nie będzie można z nich skorzystać.
Klasa bazowa
Public MustInherit Class Figura
Public MustOverride Function Pole() As Single 'Tylko Function, brak Properties End Class
Klasy potomne
Public Class Kolo Inherits FiguraPrivate _Promien As Single Sub New(Promien As Single) _Promien = Promien End Sub
Public
Overrides
Function Pole() As Single Return Math.PI * _Promien ^ 2End Function End Class
Public Class Kwadrat Inherits Figura
Private _Bok As Single Sub New(Bok As Single) _Bok = Bok
End Sub
Public Overrides Function Pole() As Single Return _Bok ^ 2
End Function End Class
Kod formularza
Private Sub ButtonOblicz_Click(sender As Object, e As EventArgs) _
Handles ButtonOblicz.Click Dim MojaFigura As Figura 'Deklarujemy zmienną na obiekt klasy Figura MojaFigura = New Kolo(CSng(TextBoxPromien.Text)) 'Konstruktor tworzy obiekt Kolo TextBoxPoleKola.Text = CStr(MojaFigura.Pole) 'Wywołujemy metodę Pole
MojaFigura = New Kwadrat(CSng(TextBoxBok.Text)) 'Konstruktor tworzy obiekt Kwadrat TextBoxPoleKwadratu.Text = CStr(MojaFigura.Pole) 'Wywołujemy metodę Pole
End Sub
Uwaga. Dzięki temu, że nie użyliśmy właściwości abstrakcyjnej w kodzie klasy bazowej (a tylko metodę abstrakcyjną Pole),:
czyli
nie użyliśmy: Public MustOverride Properties Wymiar As Single jest tylko: : Public MustOverride Function Pole() As Singlemogliśmy przy tworzeniu obiektu potomnego uzyskać podpowiedź o dokładnej treści: dla Koła będzie to Promień, (zamiast jak w poprzednim przykładzie, bliżej nieokreślony Wymiar) patrz rys.1.
Ale „coś za coś” - nie możemy się odwołać do np. do zmiennej _Promień, bo jest ona zmienną wewnętrzną – hermetyzacja obiektów zamyka zmienne lokalne (deklarowane Private) wewnątrz klasy.
Rysunek 1. InteliSense podpowiada nazwą (Promien) jaka wartość jest oczekiwana
Właściwości i Konstruktory Zadanie
Utworzyć aplikację obliczającą pola 2 figur: kwadratu i koła.
Zadanie rozwiązać wykorzystując metodę Pole w sposób polimorficzny.
Utworzymy klasę bazową Figura. Będzie to klasa abstrakcyjna (stąd atrybut MustInherit).
Niech ta klasa ma metodę abstrakcyjną (stąd atrybut
MustOverride) Pole, ale także właściwość (Properties) abstrakcyjną (
MustOverride) Wymiar.
Niech klasa ta ma dwie klasy potomne Kolo i Kwadrat. Obie klasy potomne mają metodę Pole.
Klasa bazowa
Public MustInherit Class Figura
Public MustOverride Property Wymiar As Single Public MustOverride Function Pole() As Single End Class
Klasy potomne
Public Class Kolo
Inherits FiguraPrivate _Promien As Single Sub New(Promien As Single) _Promien = Promien End Sub
Public Overrides Property Wymiar As Single Get
Return _Promien End Get
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 FiguraPrivate _Bok As Single Sub New(Bok As Single) _Bok = Bok
End Sub
Public Overrides Property Wymiar As Single Get
Return _Bok End Get
Set(value As Single) _Bok = value End Set
End Property
Public Overrides Function Pole() As Single Return _Bok ^ 2
End Function
Kod formularza
Private Sub ButtonOblicz_Click(sender As Object, e As EventArgs) _
Handles ButtonOblicz.Click Dim MojaFigura As Figura
'================= Kolo ===================
MojaFigura = New Kolo(CSng(TextBoxPromien.Text)) 'Obiekt tworzony konstruktorem TextBoxPoleKola.Text = CStr(MojaFigura.Pole) 'Wartość Pola koła.
' Mając utworzony KONSTRUKTOREM obiekt klasy Kolo z konkretnym Promieniem ' możemy zmieniać wartości promienia już bez budowania nowego obiektu ‘ przy pomocy konstyruktora, a tylko zmieniając Właściwość
If MsgBox("Czy zmienić wartość Promienia?", vbYesNo) = vbYes Then
MojaFigura.Wymiar = InputBox("Proszę wpisać nową wartość promienia", "Zmiana właściwości", MojaFigura.Wymiar)
TextBoxPromien.Text = CStr(MojaFigura.Wymiar) 'Zwrot właściwości do TextBoxu TextBoxPoleKola.Text = CStr(MojaFigura.Pole) 'Nowa wartość Pola koła.
End If
'================= Kwadrat ===================
MojaFigura = New Kwadrat(CSng(TextBoxBok.Text)) 'Obiekt tworzony konstruktorem TextBoxPoleKwadratu.Text = CStr(MojaFigura.Pole) 'Wartość Pola kwadratu ' Podobną technikę można zastosować do Kwadratu,
' który także jest wyposażony w konstruktor i właściwość.
If MsgBox("Czy zmienić wartość boku kwadratu?", vbYesNo) = vbYes Then MojaFigura.Wymiar = InputBox("Proszę wpisać nową wartość Boku",
"Zmiana właściwości", MojaFigura.Wymiar)
TextBoxBok.Text = CStr(MojaFigura.Wymiar) 'Zwrot właściwości do TextBoxu TextBoxPoleKwadratu.Text = CStr(MojaFigura.Pole) 'Nowa wartość Pola kwadratu End If
End Sub