• Nie Znaleziono Wyników

Tylko Właściwości

N/A
N/A
Protected

Academic year: 2021

Share "Tylko Właściwości"

Copied!
6
0
0

Pełen tekst

(1)

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

Public

MustInherit

Class Figura 'Klasa abstrakcyjna

Public

MustOverride

Function Pole() As Single Public

MustOverride

Property Wymiar As Single End Class

Proszę 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

Get

Throw 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

(2)

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 Figura

Private _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 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

Public Overrides Function Pole() As Single Return _Bok ^ 2

End Function End Class

Kod formularz

Public Class Form1

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 '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

(3)

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 Figura

Private _Promien As Single Sub New(Promien As Single) _Promien = Promien End Sub

Public

Overrides

Function Pole() As Single Return Math.PI * _Promien ^ 2

End 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

(4)

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 Single

mogliś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

(5)

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 Figura

Private _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 Figura

Private _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

(6)

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

Cytaty

Powiązane dokumenty

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Narysuj figury geometryczne według podanego opisu:.. Ta figura ma

Pewnie najlepiej przewidzieć datę zejścia i miejsce pochówku, bo to też powinno się znaleźć na końcu

Przyjmując, że powyższe wyliczenie stanowi katalog zamknięty, można przyjąć następującą formułę domniemania języka potocznego:” Jeżeli znaczenie danego terminu

Skonstruowa´c estymatory NW warto´sci oczekiwanej i wariancji tego rozk

Kiedy ktoś narysuje na tablicy dużą kropkę, powiedz: “Postawić kropkę nad i oznacza doprowadzić coś do końca, wyjaśnić coś, rozstrzygnąć, dopowiedzieć,

Nouriela Roubiniego [nie mogę powstrzymać się od złośliwości i napisać: no, może tylko z wyjątkiem paru uczonych, którzy napisali, że trzeba uważać, bo mogą być epidemie i

Niech zmienna losowa X oznacza czas ocze- kiwania osoby, która przyszła pierwsza, na drugą.. Wyznaczyć rozkład tej

informuje o wywieszeniu na tablicy ogłoszeń urzędu Miasta ruda Śląska wy- kazu nieruchomości własności Gminy ruda Śląska o oznaczeniu geodezyjnym 3266/3 o powierzchni 6 m 2