BotonMenu
BotonIndice

Visita : conoce3000.com
Paypal : https://www.paypal.com/donate/?hosted_button_id=XY8TZ3MGN64GE

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


11. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS II.
11.5. SOLAPAMIENTO DE OBJETOS, OPERADORES IS Y AS, Y EL MÉTODO CLASSTYPE.
11. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS II.
11.5. SOLAPAMIENTO DE OBJETOS, OPERADORES IS Y AS, Y EL MÉTODO CLASSTYPE.
11. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS II.
11.5. SOLAPAMIENTO DE OBJETOS, OPERADORES IS Y AS, Y EL MÉTODO CLASSTYPE.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Solapamiento de objetos, operadores is y as, y el método classtype.

La compatibilidad entre objetos nos dice que podemos asignar un objeto de una clase hijo a un objeto de la clase padre pero lo contrario no es posible. Cuando hacemos este tipo de asignaciones nos limitamos en el sentido de que sólo podremos usar los métodos y atributos de la clase padre. Si necesitamos usar un método o atributo de una de las clases descendientes, entonces hacemos uso del solapamiento. Veamos el siguiente ejemplo:


Descargar
{$codepage utf8} 
{$mode objfpc} 
Uses sysutils; 
Type 
     TClassAvion=Class of TAvion; 
     TAvion=class 
       Procedure Despegar;virtual;abstract; 
     End; 
     TAvComercial=class(TAvion) 
       Procedure Despegar;override; 
       Procedure Publicidad; 
     End; 
     TAvCarga=class(TAvion) 
       Procedure Despegar;override; 
     End;   
    
     Procedure TAvComercial.Despegar; 
      Begin 
        Writeln('Despegando Avion Comercial'); 
      End;  
     Procedure TAvComercial.Publicidad; 
      Begin 
        Writeln('PUBLICIDAD:Vuela aqui y nunca te caeras') 
      End;  
     Procedure TAvCarga.Despegar; 
      Begin 
        Writeln('Despegando Avion Carga') 
      End; 

Var A:TAvion; 
    Ref:TClassAvion; 
    rpta:byte; 
Begin  
  ref:=TAvion; 
  Write('Que avion quieres usar [1] Comercial, [2] Carga : ');readln(rpta); 
  Case rpta of 
    1: ref:=TAvComercial; 
    2: ref:=TAvCarga;  
  End;  
  A:=Ref.create; 
  try 
    A.Despegar; 
    if ref=TAvComercial then TAvComercial(A).Publicidad 
                        else Writeln('Este avion no tiene publicidad')  
  except 
    on EAbstractError do Writeln('No es posible despegar el avion escogido'); 
  end; 
End.
Código fuente 17: Ejemplo del uso del solapamiento entre objetos.
Descargar

En este ejemplo podemos observar que TAvComercial y TAvCarga, son clases descendientes de la clase TAvion. Debido a que estamos generalizando el programa, con el uso de métodos abstractos el usuario puede cometer el error de ingresar un avión que no existe en la lista, al hacerlo se creará un objeto de la clase TAvion, que tiene un método abstracto. Al intentar ejecutar un método abstracto, se generará la excepción EAbstracError que debemos procesar.

El programa haciendo uso de las referencias de clase, crea el avión de acuerdo a lo que el usuario escoja, pero para poder ejecutar el método Publicidad de un avión comercial, se hace uso del solapamiento con la siguiente instrucción: TAvComercial(A).Publicidad , a este solapamiento se le conoce como solapamiento directo o solapamiento duro (hard-cast).

Obviamente, antes de ejecutar el método Publicidad se debe verificar si la variable ref, tiene la clase que escogió el usuario, ya que si se crea un avión de carga, al no existir el método publicidad en dicha clase, entonces el programa generará un problema de sobre-escritura de memoria.

El uso de la referencia de clase, para comprobar si el usuario escogió un Avión Comercial se puede reemplazar con el uso del operador is, este operador devuelve un valor verdadero, si el objeto es de una clase o un objeto de una de sus clases descendientes, en caso contrario devolverá falso. Ejemplo:


Descargar
{$codepage utf8} 
{$mode objfpc} 
Uses sysutils; 
Type 
     TClassAvion=Class of TAvion; 
     TAvion=class 
       Procedure Despegar;virtual;abstract; 
     End; 
     TAvComercial=class(TAvion) 
       Procedure Despegar;override; 
       Procedure Publicidad; 
     End; 
     TAvCarga=class(TAvion) 
       Procedure Despegar;override; 
     End; 
     
     Procedure TAvComercial.Despegar; 
      Begin 
        Writeln('Despegando Avion Comercial'); 
      End;  
     Procedure TAvComercial.Publicidad; 
      Begin 
        Writeln('PUBLICIDAD:Vuela aqui y nunca te caeras') 
      End;  
     Procedure TAvCarga.Despegar; 
      Begin 
        Writeln('Despegando Avion Carga') 
      End; 

Var A:TAvion; 
    Ref:TClassAvion; 
    rpta:byte; 
Begin  
  ref:=TAvion; 
  Write('Que avion quieres usar [1] Comercial, [2] Carga : ');readln(rpta); 
  Case rpta of 
    1: ref:=TAvComercial; 
    2: ref:=TAvCarga;   
  End;  
  A:=Ref.create; 
  try 
    A.Despegar; 
    if A is TAvComercial then TAvComercial(A).Publicidad 
                         else Writeln('Este avion no tiene publicidad') 
  except 
    on EAbstractError do Writeln('No es posible despegar el avion escogido'); 
  end; 
End.
Código fuente 18: Ejemplo del uso del operador is.
Descargar

En este ejemplo hay que observar que las clases TAvCarga y TAvComercial son descendientes de la clase TAvion, y que la clase TAvCarga no es una subclase de TAvComercial. Si la clase TAvCarga fuese una subclase de TAvComercial, entonces el operador is devolverá el valor true, cada vez que se cree un objeto de la clase TAvCarga, ya que TAvCarga es una clase descendiente de TAvComercial.

En estas situaciones se debe usar el método ClassType que nos indica de que clase es un objeto, y es un método que tienen todas las clases. A continuación el mismo ejemplo pero con la clase TAvCarga descendiente de la TAvComercial, y usando el método ClassType.


Descargar
{$codepage utf8} 
{$mode objfpc} 
Uses sysutils; 
Type 
     TClassAvion=Class of TAvion; 
     TAvion=class 
       Procedure Despegar;virtual;abstract; 
     End; 
     TAvComercial=class(TAvion) 
       Procedure Despegar;override; 
       Procedure Publicidad; 
     End; 
     TAvCarga=class(TAvComercial) 
       Procedure Despegar;override; 
     End; 
    
     Procedure TAvComercial.Despegar; 
      Begin 
        Writeln('Despegando Avion Comercial'); 
      End;  
     Procedure TAvComercial.Publicidad; 
      Begin 
        Writeln('PUBLICIDAD:Vuela aqui y nunca te caeras') 
      End;  
     Procedure TAvCarga.Despegar; 
      Begin 
        Writeln('Despegando Avion Carga') 
      End; 

Var A:TAvion; 
    Ref:TClassAvion; 
    rpta:byte; 
Begin  
  ref:=TAvion; 
  Write('Que avion quieres usar [1] Comercial, [2] Carga : ');readln(rpta); 
  Case rpta of 
    1: ref:=TAvComercial; 
    2: ref:=TAvCarga;   
  End;  
  A:=Ref.create; 
  try 
    A.Despegar; 
    if A.ClassType=TAvComercial then TAvComercial(A).Publicidad 
                                else Writeln('Este avion no tiene publicidad') 
  except 
    on EAbstractError do Writeln('No es posible despegar el avion escogido'); 
  end; 
End.
Código fuente 19: Ejemplo del uso del método ClassType.
Descargar

El operador as, es un operador que nos permite solapar un objeto pero verificando si determinado objeto es de una clase o sus clases descendientes, si el solapamiento no es posible, el operador as ejecuta la excepción EInvalidCast.

Es decir hace lo mismo que un is y un solapamiento, pero con la diferencia de que este usa las excepciones cuando no se puede hacer el solapamiento. A continuación, el mismo ejemplo visto anteriormente pero usando el operador as:


Descargar
{$codepage utf8} 
{$mode objfpc} 
Uses sysutils; 
Type 
     TClassAvion=Class of TAvion; 
     TAvion=class 
       Procedure Despegar;virtual;abstract; 
     End; 
     TAvComercial=class(TAvion) 
       Procedure Despegar;override; 
       Procedure Publicidad; 
     End; 
     TAvCarga=class(TAvion) 
       Procedure Despegar;override; 
     End; 
    
     Procedure TAvComercial.Despegar; 
      Begin 
        Writeln('Despegando Avion Comercial'); 
      End;  
     Procedure TAvComercial.Publicidad; 
      Begin 
        Writeln('PUBLICIDAD:Vuela aqui y nunca te caeras') 
      End;  
     Procedure TAvCarga.Despegar; 
      Begin 
        Writeln('Despegando Avion Carga') 
      End; 

Var A:TAvion; 
    Ref:TClassAvion; 
    rpta:byte; 
Begin  
  ref:=TAvion; 
  Write('Que avion quieres usar [1] Comercial, [2] Carga : ');readln(rpta); 
  Case rpta of 
    1: ref:=TAvComercial; 
    2: ref:=TAvCarga;   
  End;  
  A:=Ref.create; 
  try 
    A.Despegar; 
    (A as TAvComercial).Publicidad 
  except 
    on EAbstractError do Writeln('No es posible despegar el avion escogido'); 
    on EInvalidCast do Writeln('Este avion no tiene publicidad') 
  end; 
End.
Código fuente 20: Ejemplo del uso del operador as.
Descargar

El operador is y as, son bastantes potentes pero conviene sólo usarlos, en casos en que el polimorfismo no se pueda aplicar por si sólo, hay que intentar usar estos operadores. No conviene usar los operadores is y as en reemplazo del polimorfismo. El impacto negativo, está en que estos operadores tienen que recorrer la jerarquía de clases para verificar si el solapamiento es posible.




SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo a través de , que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado. Para clases particulares contactame por whatsapp al 📲 (+51) 999 264 073








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.