Gå til innhold

Hjelp til objektorientert programmering


Anbefalte innlegg

Hei!

 

Har eksamen i IT VK2 og da Visual Basic over helga, og forberedelsesdag i morra. Alt går som regel fint, men sliter en del med objektorientert programmering. Noen som har kunnskaper rundt dette og kunne skrive meg en liten guide og hjelpe meg til femmeren? Noen som forøvrig har tips rundt hvordan jeg skal løse en eventuell eksamen og små fikse detaljer som kan imponere sensor?

 

Med vennlig hilsen

Eirik

 

HADDE VERT SUPERT OM NOEN KUNNE HJELPE ! : )

Videoannonse
Annonse

Men jeg har ca. ingen kunnskap om emnet. Vet bare at du i Visual Basic kan opprette slike klasser. I disse klassene legger du informasjonen, istedenfor å f.eks legge det direkte i commando-knapp koden eller lignende. Dette for at du skal kunne hente informasjon ut fra klassen. Det hadde vert fint med et eksempel på hvordan en slik klasse kunne fungere?

Et eksempel på en klasse kan være en implementasjon av et Stack-objekt, som mer eller mindre kan sammenliknes med en begrenset form av Collection:

Option Explicit

 

' Her kan du legge variabler (både Private og Public), hvor begge er tilgjengelig for alle

' prosedyrer i klassen, og sistnevnte er tilgjengelig utenfor klasssen.

Public Elements As Collection

' Private Elements As New Collection

 

' Denne metoden kalles når klassen skapes

Private Sub Class_Initialize()

 

    ' Vi må initialisere Elements da vi ikke har satt New foran Collection

    Clear

   

End Sub

 

Public Sub Clear()

 

    ' Lag en ny instans av klassen

    Set Elements = New Collection

   

End Sub

 

' Det er to typer egenskaper, GET og LET, som vist her. GET kalles som vanlige metoder, mens LET kalles ved

' [Navn på klasse].[Navn på egenskap]([Alle paramenter før den siste (vNewValue)]) = [Hva vNewValue skal være]

Public Property Get Count(Optional Filler As Variant) As Long

 

    ' Returner antall elementer

    Count = Elements.Count

   

End Property

 

' Setter antall elementer ved å enten fjerne eller legge til nye

Public Property Let Count(Optional Filler As Variant, ByVal vNewValue As Long)

   

    ' Fortsett inntil ønsket antall er oppnådd

    Do Until Count = vNewValue

        ' Se om vi må legge til eller fjerne

        If vNewValue < Count Then

            Pop ' Fjern

        Else

            Push Filler ' Legg til

        End If

    Loop

   

End Property

 

Public Sub Push(Value As Variant)

 

    ' Legger til et nytt element

    Elements.Add Value

   

End Sub

 

Public Function Pop() As Variant

 

    ' Returnerer verdien av det siste elementet

    Pop = Peek

   

    ' Fjerner det siste elementet

    Elements.Remove Count

   

End Function

 

Public Function Peek() As Variant

 

    ' Henter verdien av det siste elementet uten å fjerne det

    Peek = Elements.Item(Count)

   

End Function

 

' Denne metoden kalles når klassen frigis (eksempelvis når en variabel settes til Nothing eller

' når den går ut av "scope")

Private Sub Class_Terminate()

 

    ' Rydder opp

    Set Elements = Nothing

   

End Sub

Når du har lagd inn koden ovenfor i en klassemodul med navn Stack, kan du bruke den f.eks. som følger:

Private Sub Form_Load()

 

    Dim Test As New Stack, Result As String

   

    ' Legg til objekter

    Test.Push "OOP "

    Test.Count("er ") = 2 ' Vil legge til èn "er "

    Test.Push "svært "

   

    ' Fjern og vis det siste elementet

    MsgBox Test.Pop

 

    ' Bare vis element nummer to

    MsgBox Test.Peek

   

    ' Legg til et nytt element

    Test.Push "interessant."

   

    Do Until Test.Count = 0

        Result = Result & Test.Pop

    Next

   

    ' Vis alle elementer

    MsgBox Result

 

End Sub

Endret av aadnk

Takk. Vet ikkje heilt om eg forstod. . .men trur eg skjønner noko. Del ting eg ikkje har høyrt om, men får sjå når eg kjem på skulen i morra, og hadde vore fint om du kunne svippa innom i løpet av morradagen?

 

Såg på sida di no. . . du har laga mykje bra. Har du nokre program som har litt simple OO i seg?

Nei, så at dette var en smule simplere. Men sånn generelt, om jeg forstår det rett. Så bare definerer du hva noe skal gjøre i klassen, enten det gjelder en funksjon med et = eller bare en egenskap? Dette kan du så igjen, for å gjøre form koden med oversiktlig og ha fin struktur hente ut igjen der du trenger det så lenger du viser til klassen as New?

 

Eller er jeg helt på viddene. Merker selv at det er VELDIG vanskelig å forklare OOP.

Objektorientering er ikke så komplisert.

Tror jeg skrev en lang forklaring engang, men jeg husker ikke hvor, så jeg skriver en ny en.

 

Sammenlign objektorientering med dyre, eller planteliv.

 

Se på et menneske som en klasse (Public Class Human)

Mennesker har et slektstre (Inherits Monkey) og en rekke egenskaper og evner.

La oss kalle navn for en egenskap (Public Property Name() As String)

Siden aper ikke har navn (ihvertfall ikke seg imellom) så sier vi at Navn er en ny egenskap hos mennesker.

Men hva hvis styrke er en egenskap? aper har også styrke, og da vil automatisk også mennesker ha styrke, men kanskje med andre verdier.

Man kan også ha evner, f.eks. evnen til å løpe(Public Sub Run()), eller snakke(Public Sub Talk(output As String)).

Både mennesker og aper kan løpe, men bare mennesker kan snakke, dermed er snakke en ny egenskap hos mennesker.

 

Samme reglene gjelder, stort sett, bortsett fra i .NET programmering har vi en hendig mekanisme som heter Interfaces, det interfaces gjør, er å garanetere at en klasse implementerer en rekke funksjoner, metoder, felt, egenskaper eller hendelser.

 

men tilbake til saken; forskjellen på en instance og en deklerasjon?

 

en instance er når klassen er tatt i bruk, og deklerasjonen er "design"

Se på forskjellen som forskjellen mellom en husplantegning, og et ferdigbygget hus.

 

Public Class Monkey
 Private m_height As Double
 Private m_birth_day As DateTime

 Public Property Height()
   Get()
     Return m_height
   End Get
 End Property

 Public Property BirthDay() As DateTime
   Get()
     Return m_birth_day
   End Get
 End Property

 Public Sub Run()
   ChangeWalkMode(WalkModes.Run)
 End Sub
End Class

Public Class Human
 Inherits Monkey
 Private m_name As String
 Public Property Name() As String
   Get()
     Return m_name
   End Get
  Set(value As String)
   m_name = value
  End Set
 End Property
 Public Sub Talk(string say_what)
     AudioVideo.SoundPlayer.Play(AudioVideo.Soundbank.GenerateAudioObject(say_what))
 End Sub
End Class

Public Static Class MainClass
 Public Static Sub Main()
   Dim my_monkey As Monkey
   my_monkey = New Human()

   Console.WriteLine(my_monkey.Height)
   Console.WriteLine(my_monkey.Name) ' Ikke definert i Monkey klassen
   Console.WriteLine(CObj(my_monkey).Name) ' Definert i Human
 End Sub
End Class

På overflaten er klassemoduler helt lik vanlige moduler i det at de kan inneholde prosedyrer, funksjoner og deklarasjoner (variabler, konstanter, API), men i tillegg kan de også holde ulike verdier i variablene samtidig ved forskjellige instanser. Ta eksempelet ovenfor. Du kan lage to forskjellige Stack-objekter, men med de samme funksjoner og metoder, ved å deklarere variabelen to ganger:

Dim A As New Stack, B As New Stack

 

' Legg til verdier

A.Push "Hei"

B.Push "Hallo"

Her vil A og B være den samme modulen med den samme koden, men Elements-variabelen i hver vil være forskjellig. Dette kan man ikke oppnå med vanlige moduler. Det er for øvrig lurt å lage uavhengige moduler (noe en oppnår ganske lett med OOP) og abstraksjoner bort mye av de tekniske implementasjonsdetaljene slik at de individuelle delene av programmet kan brukes igjen uten modifikasjon. Ta Stack-objektet mitt - den kan jeg bruke i hvilket som helst program uten å endre på noe, og, dersom jeg ikke liker å bruke Collection-objektet som datakonteiner, kan jeg godt endre dette til f.eks. en Array uten at det påvirker kode som bruker den. Dette er for øvrig noe av tankegangen bak Interfaces (eller grensesnitt) - at objekter har veldefinerte metoder som godt kan implementeres annerledes men som gjør hva en forventer.

 

Det er selvsagt mye mer til OOP enn dette (interfaces, polymorphism), men du kan godt konsentrere deg om hva jeg nevnte ovenfor i første omgang.

Nå som GeirGrusom har forklart hvordan man bruker Interfaces i VB .NET, kan jeg godt komme med koden for dette i VB6. Legg følgende kode inn i en klassemodul kalt IStack:

Public Sub Clear()

End Sub

 

Public Property Get Count(Optional Filler As Variant) As Long

End Property

 

Public Sub Push(Value As Variant)

End Sub

 

Public Function Pop() As Variant

End Function

 

Public Function Peek() As Variant

End Function

Legg så til Implements IStack øverst i Stack og endre Clear til IStack_Clear, Get Count til Get IStack_Count, Push til IStack_Push, Pop til IStack_Pop og Peek til IStack_Peek.

 

Fordelen her er du nå kan bruke alle objekter som implementerer IStack PÅ SAMME MÅTE. Selv om jeg nå lager et ny StackExtended-objekt som også støtter en Item-egenskap, kan jeg, om den støtter IStack, bruke den på akkurat samme måte. Hvis du kombinerer dette, slik som det har blitt gjort svært mye i .NET, får du et svært kraftig rammeverk.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...