Kolekce objektů   zodpovězená otázka

VB.NET

Dobrý den,prosím o radu.

Mám objekt např. Bod který obsahuje nějaké vlastnosti (např. Barva, x, y).

Chtěl bych v cyklu nejdříve předat jednotlivým objektům Bod hodnoty jeho vlastností a potom (stále v cyklu) jednotlivé Body vložit do kolekce. Nějak jsem se v tom už zamotal :-( . Omlouvám se za začátečnický dotaz.

Aleš P.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
'Definice třídy představující bod
Public Class MyPoint
  Private _x As Integer
  Private _y As Integer
  Private _color As Color
  'Konstruktor s parametry pro počáteční inicializaci
  Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal color As Color)
    _x = x
    _y = y
    _color = color
  End Sub
  Public Property X() As Integer
    Get
      Return _x
    End Get
    Set (ByVal value As Integer)
      _x = value
    End Set
  End Property
  Public Property Y() As Integer
    Get
      Return _y
    End Get
    Set (ByVal value As Integer)
      _y = value
    End Set
  End Property
  Public Property Color() As Color
    Get
      Return _color
    End Get
    Set (ByVal value As Color)
      _color = value
    End Set
  End Property
End Class

'Definice typového seznamu bodů
Dim myPoints As New List(Of MyPoint)(100)
For n As Integer = 0 To 99
  'Přidání nového bodu do seznamu
  '(parametry se předají v konstruktoru)
  myPoints.Add(New MyPoint(n, n, Color.Black))
Next
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji moc za odpověď. Tato kontrukce je mi známa a také ji používám, ale v mém případě je těch vlastností poměrně hodně (cca přes 30) a tím pádem nevím jestli by tento způsob byl vhodný.

Jestli vůbec může být pomocí Sub New(byval .... předáno tolik parametrů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže díky Vašemu příkladu se mi to nakonec podařilo.

Dim myPoints As New List(Of MyPoint)(100) ' TOTO MI POMOHLO
Dim myPoint as New MyPoint
For n As Integer = 0 To 99
  'Přidání nového bodu do seznamu
  '(parametry se předají v konstruktoru)
  myPoint.Barva = dt.Rows(n)(0)
  myPoint.X = dt.Rows(n)(1)
  myPoint.Y = dt.Rows(n)(2)
  myPoints.Add(MyPoint)
Next

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Akorát že tohle je špatně, protože MyPoint je třída a ne struktura. Vy do proměnné MyPoint nejdřív přiřadíte novou instanci objektu, a pak jí v cyklu 100x měníte její vlastnosti, ale přidáváte pořád tu samou instanci do seznamu. MyPoint nereprezentuje přímo objekt, ale jenom ukazatel na objekt. Čili vy do seznamu přidáte 100 ukazatelů na stejný objekt.

Aby bylo jasno, protože MyPoint je třída, pak se nikdy její instance nekopírují, vždycky se přidá jenom odkaz:

Dim a As MyPoint = New MyPoint()   'vytvoří v paměti 1 objekt MyPoint a do proměnné a uloží ukazatel na tento objekt
Dim b As MyPoint
b = a    'do b uloží to, co je v a, tedy ne objekt, ale jenom ukazatel (objekt zůstává pořád jeden a a i b ukazují na něj)
b.X = 10    'objektu, na který ukazovalo b, nastavíme X na 10
MsgBox(a.X)  'vypíše 10, protože a i b ukazují na stejný objekt

To je rozdíl oproti strukturám. Kdyby MyPoint byla struktura, fungovalo by to tak, že při zapsání b = a by se struktura fyzicky v paměti zkopírovala, a tedy změnou b.X by se a.X neovlivnilo.

Váš kód je tedy správně takto:

Dim myPoints As New List(Of MyPoint)(100) ' TOTO MI POMOHLO
For n As Integer = 0 To 99
  'Přidání nového bodu do seznamu
  '(parametry se předají v konstruktoru)
  Dim myPoint as New MyPoint()
  myPoint.Barva = dt.Rows(n)(0)
  myPoint.X = dt.Rows(n)(1)
  myPoint.Y = dt.Rows(n)(2)
  myPoints.Add(MyPoint)
Next

Jediná změna je ta, že se deklarace proměnné MyPoint a vytvoření instance objektu přesunula dovnitř cyklu, tím pádem se vytvoří 100 instancí a každá bude jiná.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Pánové děkuji za Váš čas a rady.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback