Copyright © 2020, mgr inż. Janusz Bonarowski
1 Zadanie
Należy utworzyć klasę abstrakcyjną Figura posiadającą metodę abstrakcyjną Pole. Następnie zbudować dwie klasy pochodne. Klasę Elipsa posiadającą konstruktor wprowadzający wartości półosi Polos_a, Polos_b oraz metodę Pole. Należy również zbudować klasę Prostokat posiadającą konstruktor wprowadzający wartości Bok_a, Bok_b oraz metodę Pole.
Chcemy użyć metody Pole w sposób polimorficzny.
Formularz zawiera sześć TextBoxów i Button. Do dwóch pierwszych TextBoxów należy wprowadzić dane elipsy – półosie a i b. Do dwóch następnych należy wprowadzić długości boków a i b. Naciśnięcie
przycisku powinno utworzyć dwa obiekty: jeden klasy Elipsa, a drugi klasy Prostokat i używając metod Pole pokazać w dwóch pozostałych Textboxach wartości pól.
Wzór na pole elipsy: 𝑃 = 𝑎𝑏𝜋 Rozwiązanie
Najpierw budujemy plik klas. Klasa Figura miała być abstrakcyjna, czyli nic nie robi – i musi posiadać klasy potomne (stąd MustInherit):
Public MustInherit Class Figura
Public MustOverride Function Pole() As Single End Class
Teraz budujemy klasę potomną Elipsa.
Musi ona dziedziczyć po klasie Figura, stąd:
Inherits FiguraMa mieć konstruktor dostarczający do klasy (do wnętrza klasy) wartości półosi. „Dostarczający do klasy”
oznacza, że wartości półosi będą w klasie przechowywane w zmiennych wewnętrznych klasy (stąd słowo
Private) o nazwach zbliżonych do argumentów w konstruktorze (dla wygody). Nazwy te poprzedzamy (zwyczajowo, taka konwencja) dolnym podkreśleniem np.
_Polos_a.
Argument w konstruktorze nazywa się
Polos_a(bez dolnego podkreślenia), a zmienna wewnętrzna w klasie, niedostępna z zewnątrz klasy nazywa się
_Polos_a.Podobnie z pozostałymi nazwami argumentów konstruktorów i nazwami zmiennych wewnętrznych w klasie potomnej Elipsa i klasie potomnej Prostokat.
'--- Klasa potomna Elipsa --- Public Class Elipsa
Inherits Figura
Private _Polos_a As Single Private _Polos_b As Single
'Procedura Sub New() to jest konstruktor.
'Ma ona tyle parametrów ile trzeba. W tym wypadku 2 parametry.
Sub New(Polos_a As Single, Polos_b As Single) _Polos_a = Polos_a
_Polos_b = Polos_b End Sub
Public Overrides Function Pole() As Single Return _Polos_a * _Polos_b * Math.PI End Function
End Class
'--- Klasa potomna Prostokąt --- Public Class Prostokat
Inherits Figura
Private _Bok_a As Single Private _Bok_b As Single 'Konstruktor:
Sub New(Bok_a As Single, Bok_b As Single) _Bok_a = Bok_a
_Bok_b = Bok_b End Sub
Public Overrides Function Pole() As Single Return _Bok_a * _Bok_b
End Function End Class
Copyright © 2020, mgr inż. Janusz Bonarowski
2
Rysunek 1. FormularzKod formularza
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'Deklarujemy zmienną obiektową Mojafigura, (ale może to być też MojTrawnik, 'MojaSerweta, objKoc, objBlatStołu) która będzie klasy Figura.
'Ta deklaracja to jest adres, w którym będzie się znajdował konkretny obiekt 'utworzony później konstruktorem New(). Tutaj to jest tylko deklaracja zmiennej.
Dim Mojafigura As Figura
' Tworzymy konkretny obiekt Mojafigura. Mówimy tworzymy "instancję obiektu Elipsa".
' Używamy w tym celu konstruktora z klasy Elipsa, czyli New(...) z odpowiednimi ' parametrami:
Mojafigura = New Elipsa(CSng(TextBoxPolos_a.Text), CSng(TextBoxPolos_b.Text)) 'Obiekt powstał. Ma już swoje cechy (czyli wartości długości obu półosi).
'Możemy wykorzystać metodę Pole zwracającą pole elipsy i umieścić ją w TextBox5 TextBoxPoleElipsy.Text = CStr(Mojafigura.Pole)
' W prawdziwym, dużym programie w tym miejscu znajduje się pewna liczba instrukcji ...
' aż pojawia się potrzeba obliczenia Pola dla innego, konkretnego obiektu.
' Jest to obiekt klasy Prostokąt, który jest klasą potomną klasy bazowej Figura.
' Wykorzystujemy więc - polimorficznie - sytuację, że mamy taką klasę Prostokąt:
'(1) Tworzymy instancję (czyli konkretną realizację, konkretny obiekt) klasy Prostokąt ' w tej samej zmiennej posługując się konstruktorem (czyli New(...)):
Mojafigura = New Prostokat(CSng(TextBoxBok_a.Text), CSng(TextBoxBok_b.Text)) ' a mając już istniejący, gotowy obiekt klasy Prostokat możemy uzyskać jego pole, ' metodą Pole i umieścić wartość tego pola w TextBox6:
TextBoxPoleProstokata.Text = CStr(Mojafigura.Pole) End Sub