01 julio, 2020

8. Herencia y polimorfismo: Modificador protected, relación es-un


LOGRO DE LA UNIDAD DE APRENDIZAJE


Al término de la unidad, Ustedes aplicarán el concepto de herencia y polimorfismo, la relación de generalización/especialización entre clases, se emplearán también las técnicas de casting y clases abstractas en casos prácticos.


TEMARIO


· Conceptos básicos

· Uso del modificador protected

· Relación es-un

· Ejercicios + Link


ACTIVIDADES PROPUESTAS


· Ustedes aplican el concepto de Herencia (relación es-un).

· Ustedes emplean el modificador protected.


1. RELACIÓN DE GENERALIZACIÓN / ESPECIALIZACIÓN


La relación de generalización / especialización se da cuando dos o más clases tienen muchas de sus partes en común (atributos y métodos) lo que normalmente se abstrae en la creación de una nueva clase que reúne todas sus caracteristicas comunes.


La relación generalización / especialización es la relación de una clase más general y una clase más específica. La clase más específica se denomina clase hija o subclase y posee información adicional, mientras que la clase más general se denomina clase padre o superclase.


La generalización y la especialización son diferentes perspectivas del mismo concepto, la generalización es una perspectiva ascendente (bottom-up), mientras que la especialización es una perspectiva descendente (top-down).



Las subclases heredan características de las clases de las que se derivan y añaden características específicas que las diferencian. Las clases se organizan en una estructura jerarquica.


2. HERENCIA


La herencia es el mecanismo mediante el cual se puede definir una clase (subclase) sobre la base de otra clase (superclase) heredando aquellos miembros de la superclase (atributos y métodos) que hayan sido declarados como public, protected o sin especificador de acceso. Una superclase declara un miembro como protected para permitir el acceso al miembro desde el interior de sus subclases y desde una clase que se encuentra en el mismo paquete, a la vez que impide el acceso al miembro desde el exterior de la superclase. El constructor no es un miembro, por lo que no es heredado por las subclases. 


La nueva clase puede añadir nuevos miembros e incluso puede redefinir miembros de la superclase. Redefinir un miembro de la superclase implica definir en la subclase un miembro con el mismo nombre que el de la superclase. Esto hace que el miembro de la superclase quede oculto en la subclase. A la redefinición de métodos se denomina también sobrescritura de métodos.


La forma general de la declaración de una clase que hereda de otra clase es la siguiente:


public class nombreDeSubclase extends nombreDeSuperclase {
// Cuerpo de la clase
}


La herencia permite establecer una jerarquía de especialización mediante la relación "es-un" o "es-una".


Ejemplo 1: 


Un Mamífero es un Animal. 

Un Ave es un Animal. 

Una Vaca es un Mamífero. 

Un Pato es un Ave.


Lo que puede expresarse como:


class Animal { ... }

class Mamifero extends Animal { ... }

class Vaca extends Mamifero { ... }

class Ave extends Animal {... }

class Pato extends Ave {... }


Si una clase no tiene una superclase explícita, implícitamente su superclase es la clase Object.


Así, en el caso de la clase Animal, implícitamente figura como:


class Animal extends Object { ... }


La clase Object define e implementa un comportamiento requerido por todas las clases dentro del Sistema Java. 



Uso de super para invocar al constructor de la superclase


El constructor de la superclase puede invocarse desde la subclase utilizando la palabra super de la siguiente forma:


super(lista de argumentos);


Esta instrucción tiene que ser la primera sentencia a ejecutarse dentro del constructor de la subclase.


Ejemplo 2


Define una superclase


package padre;
public class A {
   // Atributos
   public int v1; //se hereda
   private int v2; //no se hereda
   protected int v3; //se hereda
   // Constructor
   public A(int v1, int v2, int v3){ //no se hereda
      this.v1=v1;
      this.v2=v2;
      this.v3=v3;
   }
   // Métodos de acceso
   public int getv2(){ // se hereda
      return v2;
   }
   public int getv3(){ // se hereda
      return v3;
   }
}


Define una subclase


package hijo;
import padre.A;
public class B extends A{
   // Atributo
   public int v4;
   // Constructor
   public B(int v1, int v2, int v3, int v4){
      //super invoca al constructor de la superclase
      super(v1,v2,v3);
      this.v4=v4;
   }
   public int suma(){
      return v1+getv2()+v3+v4;
   }
}



Ejemplo de uso


import hijo.B; //hay que importar la clase B del paquete hijo

// procesar es un método de la clase principal que esta
// fuera de los paquetes padre y hijo
void procesar(){
   B r = new B(1,3,5,7);
   imprimir("Objeto r de tipo B: "+r);
   imprimir("V1: " + r.v1);
   imprimir("V2: " + r.getv2());
   // utilizamos el método getv3() heredado ya que no se
   //puede emplear v3 por tener acceso protejido
   imprimir("V3: " + r.getv3());
   imprimir("V4: " + r.v4);
   imprimir("Suma: "+ r.suma());
}


Ejemplo 3


Implemente la clase Persona en el paquete padre con los siguientes miembros:


- Atributos protegidos: apellidos, nombres y edad

- Constructor que inicializa los atributos de la clase

- Un método generarCorreo() que retorna el correo formado por el primer carácter del nombre, el primer caracter del apellido, la edad y al final “@aprendec.com”.


Luego, implemente dos subclases de Persona: Docente y Alumno en el paquete hijo.


Docente presenta los siguientes miembros:


- Atributos privados: horas que dicta por semana y tarifa

- Constructor con parámetros para inicializar los atributos: apellidos, nombres, edad horas y tarifa

- Método calcularSueldo() que retorna horasXtarifa


Alumno presenta los siguientes miembros:


- Atributos privados: tres notas de tipo double

- Constructor con parámetros para inicializar los atributos: apellidos, nombres, edad y las tres notas

- Método calcularPromedio() que retorna el promedio simple de las tres notas


Por último, implemente el método Procesar de la clase Principal que contiene el actionPerformed() para crear los objetos de Docente y Alumno e invocar a sus métodos y a los de su superclase.


Clase Persona:


package padre;

public class Persona {
 // Atributos pretegidos
 protected String apellido,nombre;
 protected int edad;
 // Constructor
 public Persona(String ape, String nom, int ed) {
  apellido=ape;
  nombre=nom;
  edad=ed;
 }
 public String generarCorreo(){
  return ""+nombre.charAt(0)+apellido.charAt(0)+
  edad+"@aprendec.com";
 }
}


Subclase Docente:


package hijo;

import padre.Persona;

public class Docente extends Persona{
 // Atributos privados
 private double horas,tarifa;
 public Docente(String ape, String nom, int ed, double h, double t) {
  super(ape,nom,ed);
  horas=h;
  tarifa=t;
 }
 public double calcularSueldo(){
  return horas*tarifa;
 }
 public String mostrarDatos(){
  return "Apellido: "+apellido+"\n"+
  "Nombre: "+nombre+"\n"+
  "Edad: "+edad+"\n"+
  "Horas: "+horas+"\n"+
  "Tarifa: "+tarifa+"\n";
 }
}


Clase Alumno:


package hijo;

import padre.Persona;

public class Alumno extends Persona{
 // Atributos privados
 private double nota1,nota2,nota3;
 // Constructor
 public Alumno(String ape, String nom, int ed, double n1,
  double n2, double n3) {
  super(ape,nom,ed);
  nota1=n1;
  nota2=n2;
  nota3=n3;
 }
 public double calcularPromedio(){
  return (nota1+nota2+nota3)/3;
 }
 public String mostrarDatos(){
  return "Apellido: "+apellido+"\n"+
  "Nombre: "+nombre+"\n"+
  "Edad: "+edad+"\n"+
  "Nota1: "+nota1+"\n"+
  "Nota2: "+nota2+"\n"+
  "Nota3: "+nota3+"\n";
 }
}


En la clase Principal:


import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import hijo.*;

public class Problema03 extends JApplet implements ActionListener {
 // Declaración de variables
 JButton btnProcesar;
 JTextArea txtArea;
 JScrollPane scpScroll;
 //--------------------------------------------------------------------------
 // Crea la interfaz gráfica de usuario 
 public void init() {
  setLayout(null);
  
  btnProcesar = new JButton("Procesar");
  btnProcesar.setBounds(15,15,100,25);
  btnProcesar.addActionListener(this);
  add(btnProcesar);
  
  txtArea = new JTextArea();
  txtArea.setFont(new Font("monospaced",0,12));
    
  scpScroll = new JScrollPane(txtArea);
  scpScroll.setBounds(15,50,405,360);
  add(scpScroll);
 }
 //--------------------------------------------------------------------------
 // Procesa eventos de tipo ActionEvent
 public void actionPerformed( ActionEvent e ){
  if (e.getSource() == btnProcesar)
   procesar();
 }
 
 void procesar(){
  txtArea.setText("");
  Docente obj1 = new Docente("Rojas","Juan",25,100,35);
  imprimir("Datos: \n"+obj1.mostrarDatos());
  imprimir("su correo es:"+obj1.generarCorreo());
  imprimir("Sueldo:"+obj1.calcularSueldo()+"\n");
  
  Alumno obj2 = new Alumno("Salazar","Sandra",20,14,
  16,13);
  imprimir("Datos: \n"+obj2.mostrarDatos());
  imprimir("su correo es:"+obj2.generarCorreo());
  imprimir("Promedio:"+obj2.calcularPromedio()+"\n");
 }
 
 void imprimir(String cad){
  txtArea.append(cad + "\n");
 }
}


GUI



Descargar ejercicios

Descargar archivo


Preguntas

¿Qué es la relación de generalización/especialización?

¿En qué momento se da la relación de generalización/especialización?

¿Diferencia entre generalización y especialización?

¿Qué es herencia (relación es-un)?

¿Por qué una superclase declara sus miembros como protegido?

¿El constructor es heredado por la subclase?

¿En qué consiste redefinir un miembro de la superclase?

¿Cómo declarar una clase que hereda de otra?

¿Uso de super para invocar al constructor de la superclase?


No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!