• Nie Znaleziono Wyników

Polimorfizm – pola Polimorfizm

N/A
N/A
Protected

Academic year: 2021

Share "Polimorfizm – pola Polimorfizm"

Copied!
2
0
0

Pełen tekst

(1)

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

(2)

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

Cytaty

Powiązane dokumenty

Klasa napis ma wirtualny destruktor i dziedziczy od klasy punkt metody wirtualne p_wysokosc i p_atrybuty (niewykorzystane) oraz metodę wyswietl (wykorzystana). Klasa n_ramka

 Nie zawierają definicji metod, lecz tylko ich deklaracje publiczne (public).  Nie zawierają składowych

public void keyPressed (KeyEvent evt) { //kod obsługi zdarzeń } public void keyReleased (KeyEvent evt) { //kod obsługi zdarzeń } public void keyTyped (KeyEvent evt) { //kod

 Zmienna wskaźnikowa mająca typ pewnej klasy bazowej może wskazywać obiekty tej klasy oraz klas pochodnych - a zatem jest polimorficzna..  Zmienne niewskaźnikowe nie

Do pokrycia całej sfery można wybrać pewną skończoną liczbę płatów, a następnie skupić uwagę jedynie na tej kolekcji (na przykład powierzchnię boczną walca da się

Niech także te klasy posiadają metody o takiej samej nazwie WypiszInfo() lecz wypisujące odpowiednio różne komunikaty.. Metody te niech nadpiszą metodę z

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

Niech wartość promienia dla klasy Kolo i wartość boku dla klasy Kwadrat będzie określana przez konstruktor.. Konstruktor to procedura Sub koniecznie o