Vector erben

  • Themenstarter Themenstarter Samuel
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

Samuel

Gast
Muss ich einen Vector, wenn ich von ihm erbe, und nicht Objects haben will, alles umschreiben?

Gemeint ist folgendes: Ich habe eine Klasse ProvinzMenge, die soll die Menge der Provinzen vom Typ Provinz sein und die ProvinzMenge erbt von Vector, nun kann ich aber auf die Methoden der Provinzen ja nicht zugreifen, weil diese ja polymorph nur als Object vorhanden sind.
Sollte ich mir nun die ganze Vector klasse komplett umschreiben, also jedes add(Object) in ein add(Provinz) ändern? Oder ist das nicht die gängige Art?


Problem ist nämlich, dass ichungerne explizit typecaste, weil das nicht so sauber ist, ich habe zwar eine Liste von Objects die Provinzen enthalten, komme aber an die Provinzen nicht wirklich dran, ausser ich typecaste diese explizit in ein Provinz Objekt, die alternative wäre dann aber wie gesagt, den ganten Vector zu überschreiben
 
1. Möglichkeit: Java 1.5 und generics verwenden
2. Möglichkeit: so lassen wie es ist.. eine add(Object) akzeptiert auch add(Provinz), da jede Klasse Subklasse von Object ist... du musst halt beim rausholen dann zum Typ Provinz casten
 
Wenn ich das richtig verstanden habe heisst das Zauberwort Generics.

Code:
Vector<Provinz> Provinzmenge = new Vector<Provinz>();

Somit waere sichergestellt, dass nur Objecte vom Typ Provinz in dem Vector sind und du auch keine anderen rein packen kannst. Hoffe das ist was du gesucht hast.

Gruss
mattulla
 
mattulla hat gesagt.:
Wenn ich das richtig verstanden habe heisst das Zauberwort Generics.

Code:
Vector<Provinz> Provinzmenge = new Vector<Provinz>();

Somit waere sichergestellt, dass nur Objecte vom Typ Provinz in dem Vector sind und du auch keine anderen rein packen kannst. Hoffe das ist was du gesucht hast.

Gruss
mattulla

Hier ist aber Vorsicht geboten!!!! Generics sind erst mit JAVA 1.5 verfügbar. Wenn du eine ältere Java-Version hast musst einfach casten um auf deine Methoden zuzugreifen.

Code:
java.util.List provinzen = new Vector(); // Verwende immer Interface List kannst aber auch Vector provinzen verwenden

// Hier kannste jetzt deinem Vector so viele Provinzobjekte hinzufügen wie du willst.

// provinzen.get(xxxx) gibt dir jetzt ein Object zurück.

((Provinz) provinzen.get(xxx)).provinzmethode();  // und schon kannst du auf deine Methoden zugreifen

Hoffe ich konnt dir helfen.
 
Ehm, und ohne Generics, gibts ja nur typecasten oder den Vector so umschreiben, dass es Provinzen nimmt, was wäre die sauberer Lösung? Das Umschreiben der Menge, oder? Weil ja das Typercasten eine Fehlerquelle ist und man Objekte hin und her jagt
 
Ehm, ich verstehe Generics nicht ganz, habes gelesen und verstehe die Funktion, aber im Zusammenhang bei mir nicht ganz, ich habe eine ProvinzMenge, diese extended Vector, wenn es Generic sein soll, muss dann die Klasse ProvinzMenge so aussehen:
Code:
public class ProvinzMenge<Provinz> extends Vector {

}
Dennoch kann ich folgendes nicht machen
Code:
Provinz p  = provinzen.get(22);

Es koppt wieder bei p der typemissmatch
 
Hallo,

was soll denn an dem Casten so problematisch sein??

Wenn man unbedingt sicherstellen will das eine von Vector abgeleitet Klasse nur bestimmte andere Klassen aufnehmen kann, dann kann man ja auch z.B. die add() Methode überschreiben.

Ist jetzt nur so ein Gedankenspiel:

Code:
add(Object o) {
    if (o instanceof Provinz)
        super.add(o);
    else
        throw Exception("Kein gültiges Element");
}
 
Deine Klasse ist falsch, Samuel (Kompiliert das überhaupt?). Es müsste public class ProvinzMenge extends Vector<Provinz> heißen.

Gast: Naja, Generics sind halt schon schöner als das da 😉
 
Jep, das Generics hinter Vector hatte ich nicht, nun gehts, danke.

Es leben Generics!
 
Mußt du jetzt überhaupt noch von Vector erben? D.h. hat deine Klasse ProvinzMenge überhaupt
Methoden die Vector nicht hat? Ansonsten brauchst du ja gar keine neue Vector-Unterklasse.

Oder willst du dir Schreibarbeit sparen und ohne diese Kleiner/Größer-Zeichen auskommen?

Dann dürfte
Code:
class ProvinzMenge extends Vector<Provinz> {}
eigentlich ausreichen.
 
Es geht um logische Namenklatur, es gibt halt mehrere Mengen um diese trennen zu können, ist XMenge nur n Wrapper, ausserdem kann es sein, dass wir diese erweitern müssen, mit Dingen die Vector nicht hat
 
dennoch gilt es - lieber Delegation als Vererbung.

Die Frage ist - ist deine ProvinzMenge eine wirkliche Unterklasse von Vector, also erweitert sie die Klasse vector ? oder soll sie einfach auch als Container genommen werden ?

dann lieber delegation
Code:
public class ProvinzMenge {
  private Vector<Provinz> provinzen;
....
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben