Avatar billede mega-hawk Nybegynder
16. oktober 2010 - 10:17 Der er 16 kommentarer og
1 løsning

En rigtig god forklaring på denne kode?

Jeg er igang med at læse og lære vb.net og så er jeg kommet til et kapitel hvor jeg skal lave denne kode:

Module Module1

    Sub Main()
        Dim kunde1 As kunde = New kunde(1, "Jens Jensen    ")
        Dim kunde2 As kunde = New kunde(2, "Peter Petersen ", 12456.4)

        Console.WriteLine(kunde1.navn & " " & kunde1.saldo)
        kunde1.koeb(4000)
        kunde1.navn = "Ove Jensen"
        Console.WriteLine(kunde1.ToString())
        Console.WriteLine(kunde2.tostring())
        Console.ReadLine()
    End Sub

End Module


Public Class kunde
    Private m_KundeNr As Integer
    Private m_Navn As String
    Private m_Saldo As Double

    Public Sub New(ByVal kundenr As Integer, ByVal navn As String)
        m_KundeNr = kundenr
        m_Navn = New String(navn.ToCharArray())

    End Sub

    Public Sub New(ByVal kundenr As Integer, ByVal navn As String, ByVal saldo As Double)
        m_KundeNr = kundenr
        m_Navn = New String(navn.ToCharArray())
        m_Saldo = saldo
    End Sub

    ReadOnly Property saldo() As Double
        Get
            Return m_Saldo
        End Get
    End Property

    Public Property navn() As String
        Get
            Return m_Navn
        End Get
        Set(ByVal value As String)
            m_Navn = New String(value.ToCharArray())
        End Set
    End Property

    Public Overrides Function ToString() As String
        Return m_KundeNr.ToString() & " " & m_Navn & " " & m_Saldo.ToString()
    End Function

    Public Sub koeb(ByVal beloeb As Double)
        m_Saldo += beloeb
    End Sub

    Public Sub inbetal(ByVal beloeb As Double)
        m_Saldo -= beloeb
    End Sub
End Class

Den ender med at skrive:

Jens Jensen 0
1 Ove Jensen 4000
2 Peter Jensen 12456.4


Ret super program ik ;o)
Jeg har læst kapitlet. Skrevet koden ind og læst kapitlet igen, men stadig forstår jeg ikke koden.

Synes lige bogen måske springer lidt for let hen over det ellers har jeg bare lidt for svært ved at fortå koden, men det der New som bliver brugt alle steder frem over i bogen er jeg ikke helt med på hvordan det virker.

Bare for at gøre en lang kode kort så den her:

Public Sub New(ByVal kundenr As Integer, ByVal navn As String)
        m_KundeNr = kundenr
        m_Navn = New String(navn.ToCharArray())

    End Sub

Hvad sker der lige præcis der?

Er der nogen som kan give en rigtig god forklaring og et bedre eksempel og som er helt nede på jorden så selv et fjols som mig forstår det.
Avatar billede arne_v Ekspert
16. oktober 2010 - 16:35 #1
Public Sub New(ByVal kundenr As Integer, ByVal navn As String)
        m_KundeNr = kundenr
        m_Navn = New String(navn.ToCharArray())
End Sub

gør at

Dim kunde1 As kunde = New kunde(1, "Jens Jensen    ")

laver en instans af Kunde hvor m_KundeNr er 1 og  m_Navn er "Jens Jensen    ".
Avatar billede arne_v Ekspert
16. oktober 2010 - 16:36 #2
m_Navn = New String(navn.ToCharArray())

burde iøvrigt laves som:

m_Navn = navn

men glem alt om det indtil du har fået en 6 måneders erfaring.
Avatar billede mega-hawk Nybegynder
16. oktober 2010 - 17:28 #3
Hm men jeg er stadig ikke med på det der med new.
Ja det står der godt nok noget om senere i bogen at tochararry ikke er nødvendig
Hvis det skal lavs som arry kan man vel bare lave det som m_Navn =navn(1) eller noget i den stil?

Og hvad med m_KundeNr = kundenr hvorfor skal den så ikke hedde noget med m_KuneNr = new kundenr eller noget andet?

Har ikke forstået en meter af alt det der OOP so far... Synes da jeg forstår en del af det andet, men det der med New osv fatter ikke en bjælde huhu :o/
Avatar billede mega-hawk Nybegynder
16. oktober 2010 - 17:37 #4
Kan du ik ud over min kode her skrive en hel ny kode.
Så kort og simpel som muligt og gerne som consol kode hvor new bliver brugt så jeg måske forstår logikken i det med new og oop?
Avatar billede arne_v Ekspert
16. oktober 2010 - 17:48 #5
Hvis vi har en klasse:

Public Class X
    Public a As Integer
    Public b As Integer
    Public c As Integer
End Class

så vil den fylde 3 x 4 bytes i memory.

Hvis man nu udfører:

Dim o As X = New X()

så laver man en ny X d.v.s. at man allokerer 12 bytes i memory. De 3 felter a, b og c vil få værdien 0. Så laver man også en variabel o, som får en værdi som peger på (refererer til) den forekomst af X man lige har lavet. Og nu kan man bruge o.a, o.b og o.c til at hente og opdatere værdierne af felterne a, b og c i den nye X.
Avatar billede mega-hawk Nybegynder
16. oktober 2010 - 17:58 #6
ikke helt forstået.

Altså.

'Her laver jeg min class X

Public Class X
  Public a,b,c as Integear
end class

Dim o As x = new x()

a=1, b=2,c=3

'Kan jeg så lave noget med
o=a+b
write o

eller er det forkert forstået?
Avatar billede arne_v Ekspert
16. oktober 2010 - 18:04 #7
Du kan lave;

Dim o As x = New X()

o.a=1
o.b=2
o.c=3

Dim v As Integer = o.a + o.b
Avatar billede mega-hawk Nybegynder
16. oktober 2010 - 18:09 #8
ok.
Tror jeg forstår lidt mere nu end før, men hvorfor er det så smart at skrive

Dim o as X = new x()

o.a=1
o.b=2
o.c=3

Dim v as integer = o.a+ob

Var det ikke meget smartere bare at skrive
a=1, b=2,c=3
dim v as integer = a+b
write v
som gerne skulle give 3 går jeg ud fra?

Tror at du er ved at få mig til at forstå det med new, men jeg forstår ikke lige hvorfor det er så smart?
Avatar billede arne_v Ekspert
16. oktober 2010 - 18:15 #9
Ved at have class X får du de 3 værdier bundtet sammen. Hvis de hører logisk sammen giver det mening at de også er er bundtet sammen i programmet.

Og du kan nøjes med at sende o med over som argument til en anden sub i.s.f. 3 separate argumenter.
Avatar billede mega-hawk Nybegynder
16. oktober 2010 - 18:26 #10
altså eks hvis jeg har et spil kort kan jeg lave noget i stil med?

dim ruder,klør,spar,hjerter as integer ' deres korts værdi

dim kort as kort =new kort()

kort.ruder og kort.klør osv?

og kort.ruder(1) ville så være ruder1 og kort.ruder(2) ville være ruder 2 rigtig?

Hm ser lidt forkert ud, men ret lige den kode og så gør det som et svar for jeg er umiddelbart godt tilfreds med din forklaring.
Jeg skal bare igang med at arbejde med det for rigtig at forstå det tror jeg og bare rolig arne... Jeg vender også frygtelig tilbage med flere dumme spørgsmål ;o)
Avatar billede arne_v Ekspert
17. oktober 2010 - 02:08 #11
Ikke helt.

Jeg vill lave en:

Public Class Kort
    Public værdi As Integer
    Public farve As CardColor ' en enum med 4 værdier
End Class

(ja faktisk ville jeg lave det som 2 private fields med public properties)
Avatar billede mega-hawk Nybegynder
17. oktober 2010 - 09:04 #12
så lige der kan du ikke bruge NEW til noget?

Nå men som sagt du smider bare et svar når du vil da du har gjort dig fortjent de de points.
Med det som der står i bogen og det du skriver blandet sammen med lidt arbejde håber jeg nemlig på at forstå det.

Jeg vil prøve at lave et ultra simpel kortspil

du har 2 kort på bordert. og så en knap. Altså 2 pictureboxe og 1 knap.

Så når du trykker på denne knap så kommer der 1 kort i hver picture box fra stakken. og så kommer der en msgbox som siger hvilket kort er højest.

Det burde vel være en go start at prøve det?
Det kræver vel bare at man tager alle kort og giver dem en værdi. En random funtion som blander kortene og så en if venstre kort er større end højer then msgbox "kortet i venstre side er størst" else msgbox "Det andet kort er størst"

Eller er det ikke helt så simpel og vil du foreslå jeg venter med det til jeg har forstået lidt mere?
Avatar billede mega-hawk Nybegynder
17. oktober 2010 - 09:37 #13
ville noget i stil med det her virke?

Dim eksperten As ekspert = New ekspert()

eksperten.spørgsmål1 = "Det er godt"
eksperten.spørgsmål2 = "Ikke helt så godt"
eksperten.spørgsmål3 = "Rigtig dårlig"

Dim svar1 as string = eksperten.spørgsmål1
Dim svar2 as string = eksperten.spørgsmål2
Dim svar3 as string = eksperten.spørgsmål3

msgbox svar1


Og så hvis det er rigtig er jeg igen tabt med denne linje

Dim eksperten As ekspert = New ekspert()

Jeg erkærer eksperten as expert som bliver new ekspert()
og bruger ikke ekspert nogen steder?
Forstår du hvad jeg mener?

Er måske lidt tabt alligevel he he
Avatar billede mega-hawk Nybegynder
17. oktober 2010 - 10:37 #14
Hey tjek lige om jeg har forstået noget ;o)
Kort teori.

public class eksperten
  public spørgsmål as string
  public svar as string
end class

dim e as new eksperten

e.spørgsmål = "Er det her rigtig eller forkert?"
e.svar = "Jeg tror jeg er på rette vej"

msgbox e.spørgsmål
msgobx e.svar

Ville det virke?

Er ikke lige ved min egen computer hvor jeg kan teste det.

Og hvad er fordelen i at lave en private class med public værdier eller hvad du snakkede om arne?
Avatar billede arne_v Ekspert
17. oktober 2010 - 15:55 #15
Det ser korrekt ud.
Avatar billede arne_v Ekspert
17. oktober 2010 - 15:56 #16
Det anses som god OOP at have private fields med public properties.

Det tillader nemlig at du tilføjer lidt funktionalitet når der hentes eller sættes værdier.
Avatar billede arne_v Ekspert
17. oktober 2010 - 15:56 #17
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester