🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.lenguajes.java
Article #26958

Re: ¿Simular herencia multiple?

#26958
From: Jonathan Revusky
Date: Fri, 13 Nov 1998 00:00
142 lines
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-mail
References: <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