KlasseB mit KlasseA "verwalten"

Reverent

Erfahrenes Mitglied
Hallo Leute,
ok die Überschrift ist ein bisschen komisch ich weiß, aber egal.
So, ich habe zwei Tabellen, z.B. TabA ->1:n-> TabB.
Und passend zu dem Tabellen möchte ich, zu jeder Tabelle eine Klasse erstellen, die die Daten der jeweiligen Tabelle aufnehmen kann.
Mein Problem ist jetzt, dass die KlasseA ja die Objekte der KlasseB enthalten muß, bzw verwalten soll.
Ich habe jetzt schon viel gegooglt und auch hier gesucht, gefunden habe ich was mit 'Collections' und 'generics', aber ich komme da nicht weiter.
Eine andere Überlegung war, einfach eine ArrayList public setzten zum verwalten der Objekte, aber ich weiß nicht so recht.
Bis Dann
Markus
 

Norbert Eder

Erfahrenes Mitglied
Eigentlich recht einfach:

Du machst eine eigene Klasse (abstrakt) DataObject. Davon werden alle deine "Tabellenklassen" abgeleitet. Damit wäre das mal sauber.

Dein Collection-Problem kannst du damit lösen, dass du dir das entweder über Generics zusammenbaust, oder eben über eine eigene Collection, die mit dem Datentyp DataObject arbeitet, wodurch du natürlcih deine ganzen DataObjects ("Tabellenklassen") reinknallen kannst. Bei der Wahl der Collection hängt es natürlich auch davon ab, wie du auf eine Elemente bzw. Objekte zugreifen willst. Eine normale Liste sollte hier also reichen.

Via Generics könnte das dann so erreicht werden. Annahme: du hast eine Klasse Person und eine Klasse AddressInformation. Person enthält eine Liste aus Addressinformationen, da ja beispiels Hauptwohnsitz und Nebenwohnsitz möglich (oder könnten beispielsweise auch Rechnungsadresse und Lieferadresse sein).

C#:
public class Person : DataObject
{
  private string firstname = null;
  private string lastname = null;
  private IList<AddressInformation> addresses = new List<AddressInformation>();

  public string Firstname 
  {
    get { return this.firstname; }
    set { this.firstname = value; }
  }

  public string Lastname
  {
    get { return this.lastname; }
    set { this.lastname = value; }
  }

  public IList<AddressInformation> Addresses
  {
    get { return this.addresses; }
  }
}
(Code nicht getestet)

Die Eigenschaft Addresses hat deshalb nur einen Getter, da die Liste gleich erstellt wird und dann nur mehr mit der Liste gearbeitet wird. Ausserhalb der Klasse muss dann von dir nicht extra eine Liste erstellt werden, wenn du beispielsweise ein neues Objekt erstellst.
 

Reverent

Erfahrenes Mitglied
Hallo Norbert,
danke für deine super Antwort so in der Richtung wie du die Lösung beschrieben hast, war ich am testen.
Danke noch mal
Bis Dann
Markus
 

Reverent

Erfahrenes Mitglied
Hallo Norbert,
Du machst eine eigene Klasse (abstrakt) DataObject. Davon werden alle deine "Tabellenklassen" abgeleitet.
Warum soll ich das machen und was enthält die Klasse DataObject?
Code:
public IList<AddressInformation> Addresses
{
    get { return this.addresses; }
}
Warum nimmst du die Schnittstelle und nicht direkt List<>?

Danke noch mal!!
bis dann
Markus
 
Zuletzt bearbeitet:

Reverent

Erfahrenes Mitglied
Hallo Norbert,
Du machst eine eigene Klasse (abstrakt) DataObject. Davon werden alle deine "Tabellenklassen" abgeleitet.
Meine Frage:"Warum soll ich das machen und was enthält die Klasse DataObject?"
Er meldet mir auch noch "Inkonsistenter Zugriff"
Danke noch mal
bis dann
Markus
 

Norbert Eder

Erfahrenes Mitglied
Die Klasse DataObject ist eine abstrakte Klasse für alle deine Datenobjekte. Sie enthält Eigenschafte, die von jedem deiner Objekte geteilt wird. Beispielsweise einer ID. Dadurch, dass alle deine Datenobjekte davon abgeleitet sind, kannst du sehr einfach damit arbeiten, da alle vom gleichen Basistyp sind.

Zum Tema "inkonsistenter Zugriff": Ohne Source kann ich dir hier auch nicht wirklich weiterhelfen.

Bezüglich IList<>: Natürlich kannst du hier auch ohne dem Interface arbeiten und nur die IList<> verwenden. Ich persönlich finde es jedoch schöner, da es vorkommen kann, dass beispielsweise keine IList mehr verwendet wird, sondern eine andere Liste die IList implementiert. Wird nun mit IList gearbeitet musst du ausserhalb dieser Klasse kein weiteren Umstellungen mehr vornehmen. Gibst du eine List zurück, dann schon.