Tenho um problema com a ocultação de nomes que é extremamente difícil de resolver. Aqui está uma versão simplificada que explica o problema:
Existe uma classe: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
Então há uma aula net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
E agora, aqui está a classe problemática que herda Ae deseja chamarnet.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
}
}
Como você vê, isso não é possível. Não posso usar o nome simples Xporque está oculto por um tipo herdado. Não posso usar o nome totalmente qualificado net.foo.Xporque netestá oculto por um campo herdado.
Apenas a classe Bestá em minha base de código; as classes net.foo.Xe org.Asão classes da biblioteca, então não posso alterá-las!
Minha única solução é a seguinte: eu poderia chamar outra classe que, por sua vez, chamaria X.doSomething(); mas essa classe só existiria por causa do nome clash, que parece muito confuso! Será que não há solução em que eu posso chamar diretamente X.doSomething()a partir de B.doSomething()?
Em uma linguagem que permite especificar o namespace global, por exemplo, global::em C # ou ::em C ++, eu poderia simplesmente prefixar netcom este prefixo global, mas Java não permite isso.
net.foo.Xtem o método, não org.A.X!
A? Herança pode ser tão desagradável, como você descobriu ...
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 messy1 para atitude de código limpo. Mas, para mim, parece que essa é uma situação em que você deve fazer uma troca. Basta fazer isso e lançar um comentário longo e agradável sobre por que você teve que fazer isso (provavelmente com um link para esta pergunta).
public void help(net.foo.X x) { x.doSomething(); }e ligue comhelp(null);