Ich habe ein Problem mit dem Verstecken von Namen, das extrem schwer zu lösen ist. Hier ist eine vereinfachte Version, die das Problem erklärt:
Es gibt eine Klasse: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
Dann gibt es eine Klasse net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
Und jetzt ist hier die problematische Klasse, die von erbt A
und anrufen möchtenet.foo.X.doSomething()
package com.bar;
class B extends A {
public void doSomething(){
net.foo.X.doSomething(); // doesn't work; package net is hidden by inherited field
X.doSomething(); // doesn't work; type net.foo.X is hidden by inherited X
}
}
Wie Sie sehen, ist dies nicht möglich. Ich kann den einfachen Namen nicht verwenden, X
da er von einem geerbten Typ ausgeblendet wird. Ich kann den vollständig qualifizierten Namen nicht verwenden net.foo.X
, da er net
durch ein geerbtes Feld ausgeblendet wird.
Nur die Klasse B
befindet sich in meiner Codebasis. die Klassen net.foo.X
und org.A
sind Bibliotheksklassen, also kann ich sie nicht ändern!
Meine einzige Lösung sieht so aus: Ich könnte eine andere Klasse aufrufen, die wiederum aufruft X.doSomething()
; aber diese Klasse würde nur wegen des Namenskonflikts existieren, der sehr chaotisch erscheint! Gibt es keine Lösung , in der ich direkt anrufen kann X.doSomething()
aus B.doSomething()
?
In einer Sprache, in der der globale Namespace angegeben werden kann, z. B. global::
in C # oder ::
C ++, könnte ich einfach net
dieses globale Präfix voranstellen, aber Java lässt dies nicht zu.
net.foo.X
hat die Methode nicht org.A.X
!
A
? Vererbung kann so böse sein, wie Sie gefunden haben ...
I could call another class that in turn calls X.doSomething(); but this class would only exist because of the name clash, which seems very messy
+1 für die Einstellung von sauberem Code. Aber für mich scheint dies eine Situation zu sein, in der Sie einen Kompromiss eingehen sollten. Tun Sie dies einfach und geben Sie einen schönen langen Kommentar darüber ab, warum Sie es tun mussten (wahrscheinlich mit einem Link zu dieser Frage).
public void help(net.foo.X x) { x.doSomething(); }
und mithelp(null);