Temat: Dziedziczenie, Metody, Polimorfizm.
Dodajemy 2 klasy - StopienFazaZLewej i StopienFazaZPrawej dziedziczące po klasie Stopien_walu.
Do każdej z tych 3 klas dodajemy metody, czyli procedury, o tej samej nazwie Rysuj.
Metody te rysują, każda z nich, inny element:
stopień bez fazy, stopień z faza z lewej i z faza z prawej.
Pojawi się zatem mechanizm polimorfizmu - czyli metoda Rysuj, w zależności od obiektu, na którymjest wykonywana,
sporządzi inny rysunek stopnia.
Dodamy też możliwość usuwania stopnia.
Class1.vb
Public Class Stopien_walu
Protected _Srednica_stopnia As Single 'było Private Protected _Dlugosc_stopnia As Single 'było Private Public Property Srednica_stopnia As Single
Get
Return _Srednica_stopnia End Get
Set(value As Single)
_Srednica_stopnia = value End Set
End Property
Public Property Dlugosc_stopnia As Single Get
Return _Dlugosc_stopnia End Get
Set(value As Single)
_Dlugosc_stopnia = value End Set
End Property
Public Overridable Sub Rysuj(ByVal objRys As Graphics, ByVal objPioro As Pen, _ ByVal pozycja_x As Single, ByVal pozycja_y As Single) objRys.DrawRectangle(objPioro,
pozycja_x, pozycja_y - _Srednica_stopnia / 2, _Dlugosc_stopnia, _Srednica_stopnia)
End Sub End Class
Public Class StopienFazaZLewej Inherits Stopien_walu Private _Faza As Single
Public Property Faza As Single Get
Return _Faza End Get
Set(value As Single) _Faza = value End Set
End Property
Public Overrides Sub Rysuj(ByVal objRys As Graphics, ByVal objPioro As Pen, ByVal pozycja_x As Single, ByVal pozycja_y As Single) objRys.DrawRectangle(objPioro, _
pozycja_x + _Faza, pozycja_y - _Srednica_stopnia / 2, _Dlugosc_stopnia - _Faza, _Srednica_stopnia)
objRys.DrawLine(objPioro, _
pozycja_x, pozycja_y - _Srednica_stopnia / 2 + _Faza, pozycja_x + _Faza, pozycja_y - _Srednica_stopnia / 2) objRys.DrawLine(objPioro, _
pozycja_x, pozycja_y + _Srednica_stopnia / 2 - _Faza, pozycja_x + _Faza, pozycja_y + _Srednica_stopnia / 2) objRys.DrawLine(objPioro, _
pozycja_x, pozycja_y + _Srednica_stopnia / 2 - _Faza, pozycja_x, pozycja_y - _Srednica_stopnia / 2 + _Faza) End Sub
End Class
Public Class StopienFazaZPrawej Inherits Stopien_walu
Private _Faza As Single
Public Property Faza As Single Get
Return _Faza End Get
Set(value As Single) _Faza = value End Set
End Property
Public Overrides Sub Rysuj(ByVal objRys As Graphics, ByVal objPioro As Pen, ByVal pozycja_x As Single, ByVal pozycja_y As Single) objRys.DrawRectangle(objPioro, _
pozycja_x, pozycja_y - _Srednica_stopnia / 2, _Dlugosc_stopnia - _Faza, _Srednica_stopnia) objRys.DrawLine(objPioro, _
pozycja_x + _Dlugosc_stopnia, pozycja_y - _Srednica_stopnia / 2 + _Faza, pozycja_x + _Dlugosc_stopnia - _Faza, pozycja_y - _Srednica_stopnia / 2) objRys.DrawLine(objPioro, _
pozycja_x + _Dlugosc_stopnia, pozycja_y + _Srednica_stopnia / 2 - _Faza, pozycja_x + _Dlugosc_stopnia - _Faza, pozycja_y + _Srednica_stopnia / 2) objRys.DrawLine(objPioro, _
pozycja_x + _Dlugosc_stopnia, pozycja_y + _Srednica_stopnia / 2 - _Faza, pozycja_x + _Dlugosc_stopnia, pozycja_y - _Srednica_stopnia / 2 + _Faza) End Sub
End Class
Public Enum TrybPracy NicNieRob
NowyStopien UsunStopien End Enum
Form1.vb
Public Class Form1
Dim objRys As Graphics Dim X_osi As Integer = 50 Dim Y_osi As Integer = 200
Dim objPioroOs As New Pen(Color.Green) Dim objPioroWal As New Pen(Color.Red, 2) Dim x_pocz As Integer = X_osi
Dim mode As TrybPracy
Dim Kolekcja_stopni_walu As New List(Of Stopien_walu) Dim faza As Single
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) _
Handles Me.MouseMove LabelKoordynaty.Text = "X=" & e.X & " Y=" & e.Y
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load objRys = Me.CreateGraphics
End Sub
Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) _
Handles Me.MouseClick 'objRys.DrawLine(Pens.Blue, 150, 100, 250, 150)
'objRys.DrawRectangle(Pens.Blue, 150, 100, 200, 150) 'objRys.DrawEllipse(Pens.Blue, 150, 100, 200, 150) 'objRys.DrawArc(Pens.Red, 150, 100, 200, 150, 0, 150) Dim x1, y1 As Single
'Dim mojStopien As New Stopien_walu Dim mojStopien As Stopien_walu
Dim mojStopienL As StopienFazaZLewej Dim mojStopienP As StopienFazaZPrawej x1 = e.X
y1 = e.Y
If mode = TrybPracy.NowyStopien Then If faza = 0 Then
mojStopien = New Stopien_walu Else
If faza > 0 Then
mojStopienL = New StopienFazaZLewej mojStopienL.Faza = faza
mojStopien = mojStopienL Else
mojStopienP = New StopienFazaZPrawej mojStopienP.Faza = Math.Abs(faza) mojStopien = mojStopienP
End If End If
mojStopien.Dlugosc_stopnia = x1 - x_pocz
mojStopien.Srednica_stopnia = (Y_osi - y1) * 2
mojStopien.Rysuj(objRys, objPioroWal, x_pocz, Y_osi) 'objRys.DrawRectangle(objPioroWal, x_pocz, y1,
' x1 - x_pocz, (Y_osi - y1) * 2) x_pocz = x_pocz + mojStopien.Dlugosc_stopnia Kolekcja_stopni_walu.Add(mojStopien)
ElseIf mode = TrybPracy.UsunStopien Then
Kolekcja_stopni_walu.Remove(KliknietyStopien(x1)) Call OdswiezWalek()
End If End Sub
Private Sub RysujOsie()
objRys.DrawLine(objPioroOs, X_osi, Y_osi, 700, Y_osi) objRys.DrawLine(objPioroOs, X_osi, 50, X_osi, 350) End Sub
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint Call RysujOsie()
End Sub
Private Sub StopieńBezFazyToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles StopieńBezFazyToolStripMenuItem.Click mode = TrybPracy.NowyStopien
faza = 0 End Sub
Private Sub NicNieRóbToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles NicNieRóbToolStripMenuItem.Click mode = TrybPracy.NicNieRob
End Sub
Private Sub SkasujToolStripMenuItem_Click(sender As Object, e As EventArgs) _
Handles SkasujToolStripMenuItem.Click objRys.Clear(SystemColors.Control)
End Sub
Private Sub PokażToolStripMenuItem_Click(sender As Object, e As EventArgs) _
Handles PokażToolStripMenuItem.Click Call Narysuj()
Call RysujOsie() End Sub
Private Sub Narysuj()
Dim wsk_kolekcji As Stopien_walu x_pocz = X_osi
For Each wsk_kolekcji In Kolekcja_stopni_walu
wsk_kolekcji.Rysuj(objRys, objPioroWal, x_pocz, Y_osi) 'objRys.DrawRectangle(objPioroWal, x_pocz,
' Y_osi - wsk_kolekcji.Srednica_stopnia / 2, ' wsk_kolekcji.Dlugosc_stopnia, wsk_kolekcji.Srednica_stopnia) x_pocz = x_pocz + wsk_kolekcji.Dlugosc_stopnia
Next End Sub
Private Sub NowyWałekToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles NowyWałekToolStripMenuItem.Click x_pocz = X_osi
Kolekcja_stopni_walu.Clear()
objRys.Clear(SystemColors.Control) mode = TrybPracy.NicNieRob
End Sub
Private Sub StopieńZFaząZLewejStronyToolStripMenuItem_Click(sender As Object, _ e As EventArgs) Handles StopieńZFaząZLewejStronyToolStripMenuItem.Click mode = TrybPracy.NowyStopien
faza = 8 End Sub
Private Sub StopieńZFaząZPrawejStronyToolStripMenuItem_Click(sender As Object, _ e As EventArgs) Handles StopieńZFaząZPrawejStronyToolStripMenuItem.Click mode = TrybPracy.NowyStopien
faza = -8 End Sub
Private Sub UsuńStopieńToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles UsuńStopieńToolStripMenuItem.Click mode = TrybPracy.UsunStopien
End Sub
Private Function KliknietyStopien(ByVal x As Single) As Stopien_walu Dim x_temp As Single = X_osi
Dim i As Integer = 0
Do Until x > x_temp And x < x_temp + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia x_temp = x_temp + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia
i = i + 1 Loop
Return Kolekcja_stopni_walu.Item(i) End Function
Private Sub OdswiezWalek()
objRys.Clear(SystemColors.Control) Call Narysuj()
Call RysujOsie() 'można dodać End Sub
End Class
Rysunek 1. Rysowanie stopnia z faza z lewej strony
Rysunek 2
Wywołanie diagramu UML
Diagram UML możemy wywołać klikając, w oknie Solution Explorer, prawym klawiszem myszy na pliku Class1.vb, rys. 1 i z kontekstowego menu wybierając View Class Diagram.
Rysunek 3. Diagram klas