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 A
e 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 X
porque está oculto por um tipo herdado. Não posso usar o nome totalmente qualificado net.foo.X
porque net
está oculto por um campo herdado.
Apenas a classe B
está em minha base de código; as classes net.foo.X
e org.A
sã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 net
com este prefixo global, mas Java não permite isso.
net.foo.X
tem 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 messy
1 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);