VB, Grundkurs i objektorientering OOP # 2
Förord
Hej igen. Här kommer fortsättningen i OOP-kursen på PelleSoft. Jag har tidigare skrivit att jag kommer visa hur man bygger en klocka på ett objektorienterat sätt. Men jag tycker att det först är lämpligt att lägga in en snabblektion om sammansatta objekt, eller så kallade aggregat.Innehåll
»»
Lektion 5. Aggregat
I OOP (Objekt Orienterad Programmering) använder man sig ibland av aggregat eller samansatta objekt. Ett exempel på ett aggregat är objektet bil, som i sin tur består av objekten hjul, ratt, motor o.s.v. Motor i sig är ju också ett aggregat som bland annat består av objekten förgasare, tändstift fördelare o.s.v. Jag skall med ett kodexempel demonstrera konceptet aggregat. Vi tar den klassiska bilen. Men för att inte komplicera till det begränsar jag antalet klasser väldigt mycket. Gör följande:
Starta ett nytt VB-projekt och lägg till en form. Lägg in en Command1 och klipp och klistra in ytterligare 12 knappar. Svara ja på frågan om du vill ha en array av knappar. Lägg till följande classmoduler:
clsBil, clsGasPedal, clsBromsPedal, clsMotor, clsHjul, clsRatt, clsVäxelLåda.
Form1
Option Explicit
Private bil As New clsBil
Private Sub Command1_Click(Index As Integer)
Select Case Index
Case 0: bil.motorPå
Case 1: bil.motorAv
Case 2: bil.växlaBack
Case 3: bil.växlaFriläge
Case 4: bil.växlaEttan
Case 5: bil.växlaTvåan
Case 6: bil.växlaTrean
Case 7: bil.växlaFyran
Case 8: bil.svängVänster
Case 9: bil.svängHöger
Case 10: bil.svängRakt
Case 11: bil.gasa
Case 12: bil.bromsa
End Select
End Sub
Private Sub Form_Load()
Dim i As Integer
For i = 0 To Command1.Count - 1
Command1(i).Left = 90
Command1(i).Top = 90 + (i * Command1(i).Height)
Next i
Command1(0).Caption = "Starta Motor"
Command1(1).Caption = "Stoppa Motor"
Command1(2).Caption = "Lägg i Backen"
Command1(3).Caption = "Lägg i Friläge"
Command1(4).Caption = "Lägg i Ettan"
Command1(5).Caption = "Lägg i Tvåan"
Command1(6).Caption = "Lägg i Trean"
Command1(7).Caption = "Lägg i Fyran"
Command1(8).Caption = "Sväng Vänster"
Command1(9).Caption = "Sväng Höger"
Command1(10).Caption = "Rakt Fram"
Command1(11).Caption = "Gasa"
Command1(12).Caption = "Bromsa"
End Sub
Och nu till klasserna:
clsBil
Option Explicit
Private mvarclsGaspedal As clsGaspedal
Private mvarclsBromsPedal As clsBromsPedal
Private mvarclsMotor As clsMotor
Private mvarclsHjul As clsHjul
Private mvarclsRatt As clsRatt
Private mvarclsVäxellåda As clsVäxellåda
Public Property Get clsVäxellåda() As clsVäxellåda
Set clsVäxellåda = mvarclsVäxellåda
End Property
Public Property Set clsVäxellåda(vData As clsVäxellåda)
Set mvarclsVäxellåda = vData
End Property
Public Property Get clsRatt() As clsRatt
Set clsRatt = mvarclsRatt
End Property
Public Property Set clsRatt(vData As clsRatt)
Set mvarclsRatt = vData
End Property
Public Property Get clsHjul() As clsHjul
Set clsHjul = mvarclsHjul
End Property
Public Property Set clsHjul(vData As clsHjul)
Set mvarclsHjul = vData
End Property
Public Property Get clsMotor() As clsMotor
Set clsMotor = mvarclsMotor
End Property
Public Property Set clsMotor(vData As clsMotor)
Set mvarclsMotor = vData
End Property
Public Property Get clsBromsPedal() As clsBromsPedal
Set clsBromsPedal = mvarclsBromsPedal
End Property
Public Property Set clsBromsPedal(vData As clsBromsPedal)
Set mvarclsBromsPedal = vData
End Property
Private Sub Class_Initialize()
'create the mclsGaspedal object when the clsBil class is created
Set mvarclsGaspedal = New clsGaspedal
'create the mclsBromsPedal object when the clsBil class is created
Set mvarclsBromsPedal = New clsBromsPedal
'create the mclsMotor object when the clsBil class is created
Set mvarclsMotor = New clsMotor
'create the mclsHjul object when the clsBil class is created
Set mvarclsHjul = New clsHjul
'create the mclsRatt object when the clsBil class is created
Set mvarclsRatt = New clsRatt
'create the mclsVäxellåda object when the clsBil class is created
Set mvarclsVäxellåda = New clsVäxellåda
End Sub
Public Property Get clsGaspedal() As clsGaspedal
Set clsGaspedal = mvarclsGaspedal
End Property
Public Property Set clsGaspedal(vData As clsGaspedal)
Set mvarclsGaspedal = vData
End Property
Private Sub Class_Terminate()
Set mvarclsVäxellåda = Nothing
Set mvarclsRatt = Nothing
Set mvarclsHjul = Nothing
Set mvarclsMotor = Nothing
Set mvarclsBromsPedal = Nothing
Set mvarclsGaspedal = Nothing
End Sub
Public Sub gasa()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsGaspedal.gasa mvarclsHjul
End Sub
Public Sub bromsa()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsBromsPedal.bromsa mvarclsHjul
End Sub
Public Sub svängVänster()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsRatt.svänga "Vänster", mvarclsHjul
End Sub
Public Sub svängHöger()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsRatt.svänga "Höger", mvarclsHjul
End Sub
Public Sub svängRakt()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsRatt.svänga "Rakt"
End Sub
Public Sub växlaEttan()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsVäxellåda.växla "Ettan"
End Sub
Public Sub växlaTvåan()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsVäxellåda.växla "Tvåan"
End Sub
Public Sub växlaTrean()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsVäxellåda.växla "Trean"
End Sub
Public Sub växlaFyran()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsVäxellåda.växla "Fyran"
End Sub
Public Sub växlaBack()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsVäxellåda.växla "Back"
End Sub
Public Sub växlaFriläge()
If mvarclsMotor.motorStatus = "Av" Then Exit Sub
mvarclsVäxellåda.växla "Friläge"
End Sub
Public Sub motorPå()
If mvarclsMotor.motorStatus = "På" Then
Debug.Print "Motorn är redan på"
Else
mvarclsMotor.motorPå
End If
End Sub
Public Sub motorAv()
If mvarclsMotor.motorStatus = "Av" Then
Debug.Print "Motorn är redan av"
Else
mvarclsMotor.motorAv
End If
End Sub
clsBromsPedal
Option Explicit
Public Sub bromsa(hjul As clsHjul)
hjul.minskaHastighet
End Sub
clsGasPedal
Option Explicit
Public Sub gasa(hjul As clsHjul)
hjul.ökaHastighet
End Sub
clsMotor
Option Explicit
Private motor As Integer
Public Sub motorPå()
motor = 1
Debug.Print "Motorn startade"
End Sub
Public Function motorStatus() As String
If motor = 0 Then motorStatus = "Av"
If motor = 1 Then motorStatus = "På"
End Function
Public Sub motorAv()
motor = 0
Debug.Print "Motorn stannade"
End Sub
clsHjul
Option Explicit
Private hast As Integer
Private vridning As Integer '-1 = vänster, 1 = höger 0 = raktfram
Public Sub minskaHastighet()
'Minska speed med 10
hast = hast - 10
Dim str As String
str = "Minskade hastigheten. "
If hast = 0 Then
str = str & "Står stilla."
Else
str = str & "Hastigheten är nu " & CStr(hast)
End If
Debug.Print str
End Sub
Public Sub ökaHastighet()
'Öka hastighet med 10
hast = hast + 10
Debug.Print "Ökade hastigheten till " & CStr(hast)
End Sub
Public Sub vridVänster()
If vridning = -1 Then
Debug.Print "Akta mötande trafik"
Exit Sub
End If
vridning = vridning - 1
hjulPek
End Sub
Public Sub vridHöger()
If vridning = 1 Then
Debug.Print "Akta diket"
Exit Sub
End If
vridning = vridning + 1
hjulPek
End Sub
Public Sub vridRakt()
If vridning = 0 Then
Debug.Print "Du kan inte åka rakare än du gör just nu"
End If
vridning = 0
hjulPek
End Sub
Private Sub hjulPek()
Select Case vridning
Case -1: Debug.Print "Hjulen pkar åt vänster"
Case 0: Debug.Print "Hjulen pekar rakt fram"
Case 1: Debug.Print "Hjulen pekar åt höger"
End Select
End Sub
clsRatt
Option Explicit
Public Sub svänga(Håll As String, hjul As clsHjul)
Select Case Håll
Case "Höger": hjul.vridHöger
Case "Vänster": hjul.vridVänster
Case "Rakt": hjul.vridRakt
End Select
End Sub
clsVäxellåda
Option Explicit
Private mvarVäxel As Integer
Public Sub växla(växel As String)
Dim nyVäxel As Integer
Select Case växel
Case "Ettan": nyVäxel = 1
Case "Tvåan": nyVäxel = 2
Case "Trean": nyVäxel = 3
Case "Fyran": nyVäxel = 4
Case "Back": nyVäxel = -1
Case "Neutral": nyVäxel = 0
End Select
If mvarVäxel > 0 And nyVäxel < 0 Then
Debug.Print "Ojdå, inte bra att lägga i backen nu. Hmmmm Växelådspaj"
ElseIf Abs(nyVäxel - mvarVäxel) > 2 Then
Debug.Print "Ojsan växla lite mer varsamt"
End If
mvarVäxel = nyVäxel
Debug.Print "La i " & CStr(mvarVäxel) & ":ns växel"
End Sub
clsBil är självaste aggregatet. Koden kan se lite konstig ut och detta beror på att jag skapade
klasserna med vbClassBuilder. Jag vill påpeka att detta är inte riktigt så som jag skulle vilja
ha det. Egentligen skulle clsHjul instansieras och referens sättas till objektet från clsGasPedal,
clsBromsPedal och clsRatt.
Hoppas ni inser möjlighetn med aggregat och vad det är bra för. För att ni skall få ytterligare
förståelse för detta med aggregat kommer här ett annat exempel på detta fenomen.
Några av er kanske är bekanta med något avancerat CAD-system. Har ni då tänkt på vad som
händer när ni trycker på EXPLODE-knappen och CAD-programmet visar en sprängskiss på er
ritning. Då har den delat alla objekt i ditt aggregat "ritning". och visar dessa som en sprängskiss.
Säg att du skall rita just en Bil i ett avancerat cad system. Se varje skruv och fjäder i exempelvis
motorn som ett objekt. Dessa sätts sedan ihop till aggregatet "motor".
Vidare kan flera aggregat som "Motor", "Framsäte","Växellåda" sättas samma i aggregatet Bil. Hoppas du inser vidden av det hela, men också komplexiteten. Det var allt för denna gång. Vi ses snart igen, med utlovade kurser.
Var denna artikeln användbar?
Om du gör någon intressant (eller kanske något konstigt fel) på grund av detta material så skicka gärna det med ett mail eller bifoga en länk till mig så presenterar jag detta som ytterligare exempelfiler för kursen. Om detta innehållet är felaktigt eller du lärt dig fler finesser så skriv gärna en rad eller varför inte en egen kurs baserat på dina erfarenheter. Sänd gärna in dina tips till denna kurs./Peter Holm
0 Kommentarer