Frage zur Vererbung

  • Themenstarter Themenstarter Hannes.O
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
H

Hannes.O

Gast
Hy, ich habe eine Klasse Data welche folgende Felder hat:

Code:
Class Data:

protected LMGroups groups;
protected LMArticles articles;
protected LMConfig config;

Data(LMGroups g, LMArticles a, LMConfig c){
    this.groups = g;
    this.articles = a;
    this.config = c;
}

...methoden (protected )

Nun, in der Hauptklasse mache ich folgendes:
Code:
LMGroups groups = new LMGroups();
LMArticles articles = new LMArticles();
LMConfig config = new LMConfig();

Data data = new Data(groups,articles,config);

IP ip = new IP();
Spg spg = new Spg();

nun habe ich in der Klasse Data einige Methoden, welche die Objekte groups,articles,config verwenden.

diese methoden der klasse Data muss ich auch in den klassen IP und Spg aufrufen können. und die objekte groups, articles und config müssen natürlich instanziert sein.

wenn ich nun in den klassen IP und Spg einfach "extends Data" schreibe, dann kann ich zwar auf die Methoden und Felder der Klasse Data zugreifen, jedoch sind die Objekte groups, articles und config jeweils null, also nicht instanziert!

wie muss ich die vererbung genau machen, dass ich von den Klassen IP und Spg auf diese objekte (groups, articles udn config) zugreifen kann, welche ich beim erstellen des Data objektes übergeben habe -> Data data = new Data(groups,articles,config)?

Liebe Grüsse Hannes
 
Also das mit "extends Data" ist schonmal richtig.

Zur Problemlösung gibt es 2 Möglichkeiten:

1 Möglichkeit: Du schreibst einen Konstruktor, IP(LMGroups g, LMArticles a, LMConfig c) für die Klasse IP und für die Klasse SPG einen analogen.

2. Möglichkeit: Du verwendest "Getters and Setters". D.h. du fügst in die Klassen IP und SPG drei zusätzliche Methoden ein, die von folgender Form sind:

Code:
public void setLMGroups(LMGroups g) {
  groups = new LMGroups();
}
Die anderen gehen analog

Dann musst du allerdings noch in deiner Hauptklasse den Wert übergeben:
Code:
ip.setLMGroups(groups)

auch hier wird das mit den anderen Werten analog gemacht.

Dann sollte es funktionieren
 
Eine Möglichkeit: implementiere einen sog. Copy-Konstruktor:
Code:
Data( Data d){
    this.groups = d.groups;
    this.articles = d.articles;
    this.config = d.config;
}

Dann kannst Du schreiben
Code:
 IP ip = new IP( data);
 Spg spg = new Spg( data);
 
McLane hat gesagt.:
Murray hat gesagt.:
Eine Möglichkeit: implementiere einen sog. Copy-Konstruktor:

Aber dann braeuchte man auch wieder Getter und Setter, da die Variablen in data protected sind.

Oder mache ich jetzt einen Denkfehler?

Ja 🙂 Allerdings muss man das wissen.

ein Objekt der Klasse A darf auf protected und private Variablen von einem andern Objekt der Klasse A zugreifen.
 
1. abgeleite Klassen können auf protected Member zugreifen
2. Implementiere den Copy-Konstrukor in Data; in den abgeleiteten Klassen kannst Du dann darauf zurückgreifen:
Code:
public class IP extends Data {
   public IP( Data data) {
      super( data);
   }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben