Tematy: Klasa abstrakcyjna, Polimorfizm.
W modelu wału: usuwanie stopnia (przez wskazanego go myszą), rysowanie pręta/gwintu (polimorfizm).
Zamierzamy dodać do aplikacji funkcjonalność polegającą na tym, że możemy zmodyfikować stopień dorysowując do niego gwint lub dwie przecinające się linie symbolizujące pręt o przekroju kwadratowym.
Zadanie rozwiążemy w ten sposób, że utworzymy klasę abstrakcyjną Modyfikacja, w której metoda Rysuj będzie nadpisywana (Overridable). Ponieważ metoda ta nigdy nie będzie pracować samodzielnie, to poza nagłówkiem z parametrami i wiersza End Sub nie zawiera żadnego kodu.
Następnie utworzymy dwie klasy Pret i Gwint, które będą dziedziczyły po klasie Modyfikacja. Każda z nich będzie także posiadała metodę Rysuj nadpisującą (Overrides) metodę Rysuj z klasy bazowej Modyfikacja.
Obie metody Rysuj mają taką samą liczbę parametrów. Taką sytuację nazywamy polimorfizmem – czyli metody zachowują się różnie, w zależności od tego jakiej klasy jest obiekt, na którym są wykonywane.
Kod dodany w zadaniu z3, w stosunku do zadania z2 wyróżniono kolorem żółtym.
Class1.vb
Public Class Stopien_walu_parametry Private _Srednica_stopnia As Single Private _Dlugosc_stopnia As Single Private _Faza As Single
Private _Modyfikacja_stopnia As String Public Property Srednica_stopnia As Single Get
Return _Srednica_stopnia End Get
Set(ByVal value As Single) _Srednica_stopnia = value End Set
End Property
Public Property Dlugosc_stopnia As Single Get
Return _Dlugosc_stopnia End Get
Set(ByVal value As Single) _Dlugosc_stopnia = value End Set
End Property
Public Property Faza As Single Get
Return _Faza End Get
Set(ByVal value As Single) _Faza = value
End Set End Property
Public Property Modyfikacja_stopnia As String Get
Return _Modyfikacja_stopnia End Get
Set(ByVal value As String)
_Modyfikacja_stopnia = value End Set
End Property
Public Sub Rysuj(ByVal pozycja_X As Single, ByVal pozycja_Y As Single, _ ByVal dlugosc As Single, ByVal srednica As Single)
Dim objRys As System.Drawing.Graphics
Dim objPioroWal As New System.Drawing.Pen(Color.Red, 2) objRys = Form1.CreateGraphics
objRys.DrawRectangle(objPioroWal, pozycja_X, pozycja_Y, dlugosc, srednica) End Sub
Public Sub Rysuj(ByVal pozycja_X As Single, ByVal pozycja_Y As Single, _
ByVal dlugosc As Single, ByVal srednica As Single, ByVal faza As Single) Dim objRys As System.Drawing.Graphics
Dim objPioroWal As New System.Drawing.Pen(Color.Red, 2) Dim faza_rys As Single
objRys = Form1.CreateGraphics If faza > 0 Then
objRys.DrawRectangle(objPioroWal, pozycja_X + faza, pozycja_Y, _
dlugosc - faza, srednica) objRys.DrawLine(objPioroWal, pozycja_X, pozycja_Y + faza, _
pozycja_X, pozycja_Y + srednica - faza) objRys.DrawLine(objPioroWal, pozycja_X, pozycja_Y + faza, pozycja_X + faza, _ pozycja_Y) objRys.DrawLine(objPioroWal, pozycja_X, pozycja_Y + srednica - faza, _ pozycja_X + faza, pozycja_Y + srednica) ElseIf faza < 0 Then
faza_rys = Math.Abs(faza)
objRys.DrawRectangle(objPioroWal, pozycja_X, pozycja_Y, dlugosc - faza_rys, _ srednica) objRys.DrawLine(objPioroWal, pozycja_X + dlugosc, pozycja_Y + faza_rys, _ pozycja_X + dlugosc, pozycja_Y + srednica - faza_rys) objRys.DrawLine(objPioroWal, pozycja_X + dlugosc, pozycja_Y + faza_rys, _ pozycja_X + dlugosc - faza_rys, pozycja_Y) objRys.DrawLine(objPioroWal, pozycja_X + dlugosc, _
pozycja_Y + srednica - faza_rys, pozycja_X + dlugosc - faza_rys, _ pozycja_Y + srednica)
End If End Sub End Class
Public Class Modyfikacja
Public Overridable Sub Rysuj(ByVal X1 As Single, ByVal Y1 As Single, _
ByVal X2 As Single, ByVal Y2 As Single, ByVal X3 As Single, _ ByVal Y3 As Single, ByVal X4 As Single, ByVal Y4 As Single) End Sub
End Class
Public Class Pret
Inherits Modyfikacja
Public Overrides Sub Rysuj(ByVal X1 As Single, ByVal Y1 As Single, _ ByVal X2 As Single, ByVal Y2 As Single, _ ByVal X3 As Single, ByVal Y3 As Single, _ ByVal X4 As Single, ByVal Y4 As Single) Dim objRys As System.Drawing.Graphics
Dim objPioroWalu As New System.Drawing.Pen(Color.Red, 1) objRys = Form1.CreateGraphics
objRys.DrawLine(objPioroWalu, X1, Y1, X4, Y4) objRys.DrawLine(objPioroWalu, X2, Y2, X3, Y3) End Sub
End Class
1 3
2 4
Public Class Gwint
Inherits Modyfikacja
Public Overrides Sub Rysuj(ByVal X1 As Single, ByVal Y1 As Single, _ ByVal X2 As Single, ByVal Y2 As Single, _ ByVal X3 As Single, ByVal Y3 As Single, _ ByVal X4 As Single, ByVal Y4 As Single) Dim objRys As System.Drawing.Graphics
Dim objPioroWalu As New System.Drawing.Pen(Color.Red, 1) objRys = Form1.CreateGraphics
objRys.DrawLine(objPioroWalu, X1, Y1, X3, Y3) objRys.DrawLine(objPioroWalu, X2, Y2, X4, Y4) End Sub
End Class
Public Class Stopien_walu_powiazania Inherits Stopien_walu_parametry
Public Stopien_walu_odziedziczony As Stopien_walu_parametry Public Adres_po As Stopien_walu_parametry
End Class
Form1.vb
Public Class Form1 Dim x1 As Single Dim y1 As Single
Dim objRys As System.Drawing.Graphics
Dim objPioroOs As New System.Drawing.Pen(Color.Green, 1) Dim objPioroWal As New System.Drawing.Pen(Color.Red, 2) Dim X_osi As Integer = 50
Dim Y_osi As Integer = 200 Dim x_pocz As Integer = X_osi Dim Liczba_stopni As Integer
''Dim wsk_pocz_walka As Stopien_walu_powiazania ''Dim wsk_kon_walka As Stopien_walu_powiazania Dim Kolekcja_stopni_walu As New Collection Dim mode As Integer
Dim faza As Single = 0
Dim x_nowy_stopien As Single
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load objRys = Me.CreateGraphics
mode = 0 End Sub
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_MouseClick(sender As Object, e As MouseEventArgs) _
Handles Me.MouseClick Dim x_stopnia As Single
Dim y_stopnia As Single Dim szerokosc As Single Dim wysokosc As Single
Dim mojStopien As New Stopien_walu_parametry
''Dim mojStopien_powiazania As New Stopien_walu_powiazania Dim i As Integer
Dim objModyf As Modyfikacja Dim srednica As Single Dim dlugosc As Single
1 3
2 4
objRys.DrawLine(objPioroOs, X_osi, Y_osi, 600, Y_osi) objRys.DrawLine(objPioroOs, X_osi, X_osi, X_osi, 350) If mode = 10 Then
x1 = e.X y1 = e.Y
x_stopnia = x_pocz y_stopnia = y1
szerokosc = x1 - x_pocz wysokosc = (Y_osi - y1) * 2 x_pocz = x_pocz + szerokosc
Liczba_stopni = Liczba_stopni + 1 mojStopien.Dlugosc_stopnia = szerokosc mojStopien.Srednica_stopnia = wysokosc mojStopien.Faza = faza
''If Liczba_stopni = 1 Then
'' mojStopien_powiazania.Stopien_walu_odziedziczony = mojStopien '' wsk_pocz_walka = mojStopien_powiazania
'' wsk_kon_walka = mojStopien_powiazania ''Else
'' mojStopien_powiazania.Stopien_walu_odziedziczony = mojStopien '' wsk_kon_walka.Adres_po = mojStopien_powiazania
'' wsk_kon_walka = mojStopien_powiazania ''End If
Kolekcja_stopni_walu.Add(mojStopien) If faza <> 0 Then
mojStopien.Rysuj(x_stopnia, y_stopnia, szerokosc, wysokosc, faza) Else
mojStopien.Rysuj(x_stopnia, y_stopnia, szerokosc, wysokosc) End If
x_nowy_stopien = x_pocz ElseIf mode = 13 Then
x1 = e.X
x_pocz = X_osi
objRys.Clear(SystemColors.Control) i = 1
Do Until x1 > x_pocz And x1 <= x_pocz + _
Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia x_pocz = x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia
i = i + 1 Loop
Kolekcja_stopni_walu.Remove(i) Liczba_stopni = Liczba_stopni - 1 Call Narysuj()
ElseIf mode = 21 Then 'pręt x1 = e.X
x_pocz = X_osi i = 1
Do Until x1 > x_pocz And x1 <= x_pocz + _
Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia x_pocz = x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia
i = i + 1 Loop
mojStopien = Kolekcja_stopni_walu.Item(i) mojStopien.Modyfikacja_stopnia = "Pret"
objModyf = New Pret
srednica = mojStopien.Srednica_stopnia dlugosc = mojStopien.Dlugosc_stopnia
objModyf.Rysuj(x_pocz, Y_osi - srednica / 2, x_pocz, Y_osi + srednica / 2,
x_pocz + dlugosc, Y_osi - srednica / 2, x_pocz + dlugosc, Y_osi + srednica / 2) x_pocz = x_nowy_stopien
ElseIf mode = 22 Then 'gwint x1 = e.X
x_pocz = X_osi i = 1
Do Until x1 > x_pocz And x1 <= x_pocz + _
Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia x_pocz = x_pocz + Kolekcja_stopni_walu.Item(i).Dlugosc_stopnia
i = i + 1 Loop
mojStopien = Kolekcja_stopni_walu.Item(i) mojStopien.Modyfikacja_stopnia = "Gwint"
objModyf = New Gwint
srednica = mojStopien.Srednica_stopnia dlugosc = mojStopien.Dlugosc_stopnia
objModyf.Rysuj(x_pocz, Y_osi - srednica / 2 + 8, x_pocz, Y_osi + srednica / 2 - 8,
x_pocz + dlugosc, Y_osi - srednica / 2 + 8, x_pocz + dlugosc, Y_osi + srednica / 2 - 8) x_pocz = x_nowy_stopien
End If End Sub
Private Sub PokażToolStripMenuItem_Click(sender As Object, e As EventArgs) _
Handles PokażToolStripMenuItem.Click Call Narysuj()
End Sub
Private Sub SkasujToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles SkasujToolStripMenuItem.Click objRys.Clear(SystemColors.Control)
End Sub
Private Sub Narysuj()
Dim x_stopnia As Single Dim y_stopnia As Single Dim szerokosc As Single Dim wysokosc As Single
''Dim walek_tim As Stopien_walu_powiazania Dim wsk_kolekcji As Stopien_walu_parametry Dim objModyf As Modyfikacja
Dim srednica As Single Dim dlugosc As Single
objRys.DrawLine(objPioroOs, X_osi, Y_osi, 600, Y_osi) objRys.DrawLine(objPioroOs, X_osi, X_osi, X_osi, 350) x_pocz = X_osi
''walek_tim = wsk_pocz_walka ''For i = 1 To Liczba_stopni '' x_stopnia = x_pocz
'' y_stopnia = Y_osi - walek_tim.Stopien_walu_odziedziczony.Srednica_stopnia / 2 '' szerokosc = walek_tim.Stopien_walu_odziedziczony.Dlugosc_stopnia
'' wysokosc = walek_tim.Stopien_walu_odziedziczony.Srednica_stopnia
'' objRys.DrawRectangle(objPioroWal, x_stopnia, y_stopnia, szerokosc, wysokosc) '' x_pocz = x_pocz + szerokosc
'' walek_tim = walek_tim.Adres_po
''Next
For Each wsk_kolekcji In Kolekcja_stopni_walu x_stopnia = x_pocz
y_stopnia = Y_osi - wsk_kolekcji.Srednica_stopnia / 2 szerokosc = wsk_kolekcji.Dlugosc_stopnia
wysokosc = wsk_kolekcji.Srednica_stopnia If wsk_kolekcji.Faza <> 0 Then
wsk_kolekcji.Rysuj(x_stopnia, y_stopnia, szerokosc, wysokosc, _
wsk_kolekcji.Faza) Else
wsk_kolekcji.Rysuj(x_stopnia, y_stopnia, szerokosc, wysokosc) End If
srednica = wsk_kolekcji.Srednica_stopnia dlugosc = wsk_kolekcji.Dlugosc_stopnia
If wsk_kolekcji.Modyfikacja_stopnia = "Pret" Then objModyf = New Pret
objModyf.Rysuj(x_pocz, Y_osi - srednica / 2, x_pocz, Y_osi + srednica / 2,
x_pocz + dlugosc, Y_osi - srednica / 2, x_pocz + dlugosc, Y_osi + srednica / 2) ElseIf wsk_kolekcji.Modyfikacja_stopnia = "Gwint" Then objModyf = New Gwint
objModyf.Rysuj(x_pocz, Y_osi - srednica / 2 + 8, x_pocz, Y_osi + srednica / 2 - 8,
x_pocz + dlugosc, Y_osi - srednica / 2 + 8, x_pocz + dlugosc, Y_osi + srednica / 2 - 8) End If
x_pocz = x_pocz + szerokosc Next
End Sub
Private Sub NowyWałekToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles NowyWałekToolStripMenuItem.Click mode = 0
x_pocz = X_osi
Kolekcja_stopni_walu.Clear() Liczba_stopni = 0
objRys.Clear(SystemColors.Control)
objRys.DrawLine(objPioroOs, X_osi, Y_osi, 600, Y_osi) objRys.DrawLine(objPioroOs, X_osi, X_osi, X_osi, 350) End Sub
Private Sub StopnieBezFazyToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles StopnieBezFazyToolStripMenuItem.Click mode = 10
faza = 0 End Sub
Private Sub StopnieZFazaZLewejStronyToolStripMenuItem_Click(sender As Object, _ e As EventArgs) Handles StopnieZFazaZLewejStronyToolStripMenuItem.Click mode = 10
faza = 8 End Sub
Private Sub StopnieZFazaZPrawejStronyToolStripMenuItem_Click(sender As Object, _ e As EventArgs) Handles StopnieZFazaZPrawejStronyToolStripMenuItem.Click mode = 10
faza = -8 End Sub
Private Sub NicNieRóbToolStripMenuItem_Click(sender As Object, e As EventArgs) _
Handles NicNieRóbToolStripMenuItem.Click mode = 0
End Sub
Private Sub UsuńStopieńToolStripMenuItem_Click(sender As Object, e As EventArgs) _ Handles UsuńStopieńToolStripMenuItem.Click mode = 13
End Sub
Private Sub PrętToolStripMenuItem_Click(sender As Object, e As EventArgs) _
Handles PrętToolStripMenuItem.Click mode = 21
End Sub
Private Sub GwintToolStripMenuItem_Click(sender As Object, e As EventArgs) _
Handles GwintToolStripMenuItem.Click mode = 22
End Sub End Class