Article View: es.comp.lenguajes.java
Article #26958Re: ¿Simular herencia multiple?
From: Jonathan Revusky
Date: Fri, 13 Nov 1998 00:00
Date: Fri, 13 Nov 1998 00:00
142 lines
4849 bytes
4849 bytes
Juan Gonzalo de Silva Medina wrote:
>
> Jonathan Revusky wrote:
>
> >
> > [...]
> > Tendr�a que ser algo como:
> >
> > protected void mensajeA()
> >
> > ya que incluso las subclases de A no pueden acceder a la implementaci�n
> > "private". Tiene que ser "protected".
>
> Vale, mala hora para probar...
>
> >
> > >[...]
> > La clase D no puede ser compilada porque no hay ninguna instancia de B a
> > la que la instancia de clase C puede ser asociada. (�Eso es claro
> > acaso?)
>
> Ciertamente, no.
Bien. Gracias, por dec�rmelo. A veces, tengo la inc�moda sensaci�n de
que he contestado algo de modo un tanto cr�ptico quiz�, pero que no me
piden que lo explicite m�s porque tienen miedo de parecer tontos o algo
as�.
> No entiendo lo que quieres decir por "asociada" �?.
A ver. En el contexto de una clase, (por lo menos si no estamos en un
m�todo est�tico) siempre hay una referencia impl�cita a una instancia de
la clase.
Se trata del "this".
En el caso de una clase interior, en realidad hay dos referencias tipo
"this". Hay una referencia a la clase en s� y la clase que la contiene.
La inner class y la outer class. En el c�digo en cuesti�n:
class B {
private void mensajeB() {...}
class C extends A {
mensajeA(); // Es equivalente a this.mensajeA();
mensajeB(); // Esto es equivalente a B.this.mensajeB();
}
}
Es decir que hay dos referencias "this". Si hay que explicitar el "this"
de la clase exterior, se utiliza la sintaxis: OuterClass.this.methode();
Si entiendes todo esto, creo que se ve bastante f�cilmente porque en la
clase D, no puedes instanciar la inner class C sin tener una instancia
de B. Cuando dije que no hab�a ninguna instancia de B a la que la clase
C pod�a ser asociada, es lo que quer�a decir.
class B {
private void mensajeB() {...}
class C extends A {
....
}
C createC() {
// aqu�, s� que hay una instancia impl�cita de la
// outer class B as� que funciona.
return new C();
}
}
>
> No me funciona, y sigo con lo mismo :-?, en la clase D no puede aparecer
> ninguna referencia a la clase C ya que el compilador no puede encontrar
> la definicion de la clase. Existe solamente dentro de la clase B.
Me equivoqu� en el ejemplo, de hecho. Eso suele ocurrirnos a los
mortales cuando entramos c�digo directamente en Netscape sin verificar
que se compila. :-)
public class D {
public static void main(String s[]){
B b = new B();
B.C c = b.createC();
//Hab�a que explicitar B.C,
//aunque se podr�a haber puesto: import B.*;
//todo arriba y entonces se podr�a haber escrito simplemente:
// C c = b.createC();
c.mensajes();
}
}
> �rollo? no creo, a mi me gusta urgar dentro, lo otro..., ya lo dice el
> manual :-).
>
> Saludos,
>
> P.S.: Por la velocidad parece un chat ;-).
Ya no. :-)
De todas formas, agrego abajo el c�digo ilustrativo. He verificado que
s� que se compila y funciona. Como dije, es un modo de "simular" la
herencia m�ltiple ya que la clase B.C puede acceder transparentement a
la implementaci�n protegida de las clases A y B.
De hecho, todo esto es mucho mejor que la herencia m�ltiple de C++ por
una variedad de motivos...
Jonathan Revusky
--
Available for Java and Delphi Consulting
Make your .class files double-clickable
with SmartJ
http://www.bigfoot.com/~crystalline.solutions
-------------------------------------------------------------
// El fichero D.java que ilustra
// algunos puntos finos sobre las inner clases.
class A {
protected void mensajeA(){ System.out.println("Soy a"); }
}
class B {
private void mensajeB(){ System.out.println("Soy b"); }
class C extends A{
public void mensajes(){
mensajeA();
mensajeB();
}
}
C createC() {
return new C();
}
}
public class D {
public static void main(String s[]){
B b = new B();
B.C c = b.createC();
c.mensajes();
}
}
Technical Details
Message-ID:
<364C426C.8EC9A443@jet.es>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<72em2t$n0v$1@talia.mad.ibernet.es> <364B1D17.F50D6DAD@jet.es> <364B6C4E.F2B2D0C7@caymasa.es> <364B720E.14C0B1B8@jet.es> <364B7C4D.9EFDDEB8@caymasa.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: 1116f3,a73bec53770fedc9 X-Google-Attributes: gid1116f3,public From: Jonathan Revusky <jrevusky@jet.es> Subject: Re: ¿Simular herencia multiple? Date: 1998/11/13 Message-ID: <364C426C.8EC9A443@jet.es> X-Deja-AN: 411467911 Content-Transfer-Encoding: 8bit References: <72em2t$n0v$1@talia.mad.ibernet.es> <364B1D17.F50D6DAD@jet.es> <364B6C4E.F2B2D0C7@caymasa.es> <364B720E.14C0B1B8@jet.es> <364B7C4D.9EFDDEB8@caymasa.es> X-Accept-Language: en Content-Type: text/plain; charset=iso-8859-1 Organization: Telefonica Transmision de Datos Mime-Version: 1.0 Reply-To: jrevusky@bigfoot.com Newsgroups: es.comp.lenguajes.java