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 ClassMillainen 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 SubHaluaisin 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ä = 0Jos 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 SubEikö 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ä = 0Tiedä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 ClassHeippa 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.