Ich habe eine abstrakte Klasse, relation
in Paket database.relation
und eine Unterklasse davon, Join
, in Paket database.operations
. relation
hat ein geschütztes Mitglied mit dem Namen mStructure
.Warum kann meine Unterklasse nicht auf eine geschützte Variable ihrer Oberklasse zugreifen, wenn sie sich in einem anderen Paket befindet?
In Join
:
public Join(final Relation relLeft, final Relation relRight) {
super();
mRelLeft = relLeft;
mRelRight = relRight;
mStructure = new LinkedList<Header>();
this.copyStructure(mRelLeft.mStructure);
for (final Header header :mRelRight.mStructure) {
if (!mStructure.contains(header)) {
mStructure.add(header);
}
}
}
Auf Linien
this.copyStructure(mRelLeft.mStructure);
und
for (final Header header : mRelRight.mStructure) {
ich die folgende Fehlermeldung erhalten:
The field Relation.mStructure is not visible
Wenn ich beide Klassen in ein Paket legen, funktioniert das perfekt. Kann jemand dieses Problem erklären?
Wird eine geeignete Lösung sein, einen geschützten Accessor zu definieren? –
Das gleiche würde passieren. Interessanter wäre es zu wissen, ob "Join" IS-A "Relation" ist und wenn ja, warum sollten sie in verschiedenen Paketen gehen. Wahrscheinlich, ein Zwischenobjekt zu verwenden, um die Struktur zu abstrahieren und zu tun. Ich würde vorschlagen, dass Sie sie im selben Paket für jetzt verschieben, nur um zu vermeiden, in eine Codierungslähmung einzutreten. – OscarRyz
Ich glaube, Ihr erster Satz wäre ein wenig genauer, wenn Sie sagen, dass Sie innerhalb der Kindklasse auf dieses Mitglied in jeder Instanz der Kindklasse * oder auf jede Instanz einer Klasse zugreifen können, die von der Kindklasse * erbt, aber nicht jede Instanz einer Klasse, von der die Kindklasse erbt. (Siehe Abschnitt 6.6.2.1 der Spezifikation: http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2). Es kann es also in weiter abgeleiteten Mitgliedern des Vererbungsbaums sehen, nur nicht in weniger abgeleiteten Mitgliedern. –