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 Ay 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 Xporque está oculto por un tipo heredado. No puedo usar el nombre completo net.foo.Xporque netestá oculto por un campo heredado.
Solo la clase Bestá en mi base de código; las clases net.foo.Xy org.Ason 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 neteste prefijo global, pero Java no lo permite.
net.foo.Xtiene 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);