解決するのが非常に難しい名前の非表示に問題があります。これは問題を説明する簡単なバージョンです:
クラスがあります: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
それからクラスがあります net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
そして今、ここから継承しA
て呼び出したい問題のあるクラスがありますnet.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
}
}
ご覧のとおり、これは不可能です。単純な名前X
は継承されたタイプによって非表示になっているため、使用できません。完全修飾名は使用できません。継承されたフィールドによって非表示になっているnet.foo.X
ためnet
です。
クラスだけB
が私のコードベースにあります。クラスnet.foo.X
とorg.A
はライブラリクラスなので、変更できません!
私の唯一の解決策は次のようになりますX.doSomething()
。しかし、このクラスは名前の衝突のためにのみ存在し、これは非常に厄介なようです!X.doSomething()
から直接呼び出すことができる解決策はありませんB.doSomething()
か?
global::
C#や::
C ++ などのグローバルネームスペースを指定できる言語ではnet
、このグローバルプレフィックスをプレフィックスとして付けることもできますが、Javaでは許可されていません。
net.foo.X
メソッドではなく、org.A.X
!
A
ますか?ご存知のように、継承は非常に厄介なものになる可能性があります...
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。しかし、私にとっては、これはトレードオフを行うべき状況のようです。単にこれを実行し、なぜそれを実行しなければならなかったのかについての長いコメントを投げてください(おそらくこの質問へのリンクが付いています)。
public void help(net.foo.X x) { x.doSomething(); }
そして次のように呼び出しますhelp(null);