Tengo un problema con la ocultación de nombres que es extremadamente difícil de resolver. Aquí hay una versión simplificada que explica el problema:
Hay una clase: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
Entonces hay una clase net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
Y ahora, aquí está la clase problemática que hereda A
y quiere llamarnet.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 ve, esto no es posible. No puedo usar el nombre simple X
porque está oculto por un tipo heredado. No puedo usar el nombre completo net.foo.X
porque net
está oculto por un campo heredado.
Solo la clase B
está en mi base de código; las clases net.foo.X
y org.A
son clases de biblioteca, ¡así que no puedo alterarlas!
Mi única solución se ve así: podría llamar a otra clase que a su vez llama X.doSomething()
; pero esta clase solo existiría debido al choque de nombres, ¡que parece muy complicado! ¿No hay solución en la que puedo llamar directamente X.doSomething()
desde B.doSomething()
?
En un lenguaje que permite especificar el espacio de nombres global, por ejemplo, global::
en C # o ::
en C ++, podría simplemente prefijar net
este prefijo global, pero Java no lo permite.
net.foo.X
tiene el método, no org.A.X
!
A
? La herencia puede ser tan desagradable, como has descubierto ...
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 por actitud de código limpio. Pero para mí, parece que esta es una situación en la que debería hacer una compensación. Simplemente haga esto y envíe un comentario largo y agradable sobre por qué tuvo que hacerlo (probablemente con un enlace a esta pregunta).
public void help(net.foo.X x) { x.doSomething(); }
y llamar conhelp(null);