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