Module Metsänhoito_module Dim SysiMetsä As New Metsä_class Sub KaadaPuut(ByVal Laji As String) For i As Integer = 0 To SysiMetsä.Puut.Length - 1 If SysiMetsä.Puut(i).Laji = Laji Then SysiMetsä.Puut(i).Määrä = 0 Exit For End If Next End Sub End Module Public Class Metsä_class Public Puut(-1) As Puut_class Public Class Puut_class Public Laji As String Public Määrä As Integer End Class Public Sub LisääUusiPuu(ByVal Laji As String) ReDim Preserve Puut(Puut.Length) Puut(Puut.Length - 1).Laji = Laji End Sub End Class
Millainen koodi luokassa pitäisi olla jotta saan kaadettua kaikki esim. männyt alla olevalla aliohjelmalla?
Sub KaadaPuut(ByVal Laji As String) SysiMetsä.Puut(Laji).Määrä = 0 End Sub
Haluaisin koodissaani vaikuttaa puiden määrään molemmilla tavoilla; taulukon indexi numerolla ja puun lajilla.
SysiMetsä.Puut("koivu").Määrä = 0 SysiMetsä.Puut(4).Määrä = 0
Jos poistat tuosta KaadaPuut functiosta tuon Exit For, niin eikö sen pitäisi hoitaa homma? Kun sitä kutsutaan KaadaPuut("koivu")
Sub KaadaPuut(ByVal Laji As String) For i As Integer = 0 To SysiMetsä.Puut.Length - 1 If SysiMetsä.Puut(i).Laji = Laji Then SysiMetsä.Puut(i).Määrä = 0 End If Next End Sub
Eikö tuo määrä pitäisi muuttaa kyllä 'kaadettu' tms. Sais varmaa vähä loogisemman tuosta. Tuo indexillä viittaus sitten toimisi suoraan SysiMetsä.Puut(4).Kaadettu = true
Tuo koodi on vain keksimäni yksinkertaistettu esimerkki.
Mitään varsinaista ongelmaa ei ole, saan kyllä "kaadettua kaikki puut".
Haluaisin vain sisällyttää luokkaan metodin jolla saan pääohjelmasta kaadettua puita indexinumerolla ja puun lajilla.
SysiMetsä.Puut("koivu").Määrä = 0 'ja SysiMetsä.Puut(4).Määrä = 0
Tiedän, että Puut() on taulukko johon ei voi viitata muulla kuin indexinumerolla (vai voiko? miten?).
Millainen metodi luokkaan pitäisi koodata jotta voisin kaataa puita em. tavalla?
(Konekäännetty c#:sta, jolla mielestäni on kivempi kirjoittaa. Alkuperäinen koodi)
Class Puut Private lajit As New Dictionary(Of String, Integer)() Private puut As New List(Of Puu)() Public Default Property Item(index As Integer) As Puu Get Return puut(index) End Get Set puut(index) = value End Set End Property Public Default Property Item(laji As String) As Puu Get Return puut(lajit(laji)) End Get Set puut(lajit(laji)) = value End Set End Property Public Function Add(laji As String, puu As Puu) As Integer ' palauttaa lisätyn puun indeksin If lajit.ContainsKey(laji) Then Throw New Exception("Laji on jo") End If puut.Add(puu) Dim newIndex As Integer = puut.Count - 1 lajit(laji) = newIndex Return newIndex End Function End Class Class Puu Public Property Laji() As String Get Return m_Laji End Get Set m_Laji = Value End Set End Property Private m_Laji As String Public Property Määrä() As Integer Get Return m_Määrä End Get Set m_Määrä = Value End Set End Property Private m_Määrä As Integer End Class
Heippa taas!
Onko QBasic ja Visual Basic -osastosta tulossa C# mainos..?
No se on miten sen haluat ottaa. Ajattelin mainita konekäännöksestä siltä varalta, että joku ihmettelee koodin rakennetta.
Oletan myöskin ettei ihan kaikki tiedä, että VB.Net ja C# on käytännössä sama kieli vähän eri näköisenä ja että niitä voi kääntää koneellisesti ristiin. Joskus voi olla helpompi löytää vaikkapa netistä esimerkki toisella kielellä kuin mitä itse käyttää.
Siinäpä se... Dictionary... kiitti Grez!
Aihe on jo aika vanha, joten et voi enää vastata siihen.