Está en la página 1de 43

HERENCIA Y

POLIMORFISMO
Unidad 4
Ing. Yoelma Melendres
yymelendresf@doc.emi.edu.bo
CRITERIO DE DESEMPEÑO

Aplica herencia y polimorfismo; definiendo


superclases, subclases; realizando la
protección de miembros, de clases y la
redefinición de miembros; describiendo la
herencia múltiple; empleando polimorfismo,
interfaces y clases abstractas.

2
CONTENIDO

4.1 Definición de superclases


4.2 Definición de subclases
4.3 Constructores protegidos
4.4 Métodos protegidos
4.5 Redefinición de métodos en base al
polimorfismo
4.6 Problemas de herencia y polimorfismos
3
4.1. Superclases y subclases
Representación gráfica: Descripción
■ Es una estructura jerárquica,
donde las subclases heredan
los atributos y funciones de la
superclase, pudiendo agregar
nuevos atributos y funciones.
■ En la subclase, es posible
redefinir o reemplazar la
implementación de ciertas
funciones, que así
convengan, generando una
nueva versión de dichas
funciones.
4
class Modelo de dominio

Ejemplo: -
Vehiculo

placa: string
- codigoColor: int Superclase
- año: int
- codigoModelo: int

+ modificar(int, int, int, string) : void


+ mostrar(listBox) : void

Auto Camión
Subclases
- descapotable: bool - tonelaje: int
- nroRuedas: int
+ modificar(string, bool, int, int, int) : void
+ motrar(listBox) : void + modificar(string, int, int, int, int, int) : void
+ mostrar(listBox) : void

5
Implementación de herencia
class vehiculo
Para heredar los atributos,
{ protected string placa; en la clase base, deben
protected int año; declararse con la
… visibilidad protected.

} En el caso de funciones, si
son publicas, son
class auto:vehiculo accesibles desde las
clases derivadas.
{

}
6
Tipos de Visibilidad class vehiculo
{ protected string placa;
protected int año;
TIPOS DE private public protected …
VISIBILIDAD
//dentro de la clase
Dentro de la clase SI SI SI
Fuera de la clase NO SI NO
}
En subclases NO SI SI //Fuera de la clase
class auto:vehiculo
{ //dentro de una subclase

}

7
Persona
CI
Nombre Ejemplo clases de un sistema académico.
apellidoPaterno
apellidoMaterno
Dirección
Telefono
Correo
FechaNacimiento
LugarNacimiento
PaisNacimiento
MostrarDatos()

Estudiante Docente Administrativo


Registro Profesión Cargo
Tutor AñoDeTitulación añoIngreso
telefonoTutor MostrarDatos() MostrarDatos()
MostrarDatos() AñosDeAntiguedad() ModificarCargo()
ActualizarDatos()
ModificarTutor()
8
Ejemplo de herencia
class Class Model

Vehiculo

# placa: string
# año: int

+ Vehiculo(string, int)
+ Antiguedad(int): int

Auto
Camion
- descapotable: bool
- Tonelaje: int
+ Auto(string, int, bool)
- nroRuedas: int
+ Mostrar(): string
+ Camion(string, int, int, int)

9
Ejemplo de herencia
class Class Model

Vehiculo

# placa: string
# año: int

+ Vehiculo(string, int)
+ Antiguedad(int): int

Camion

Auto
- Tonelaje: int
- nroRuedas: int
- descapotable: bool
+ Camion(string, int, int, int)
+ Auto(string, int, bool) + Mostrar() : string
+ Mostrar(): string + ModificarDatos(string, int, int, int): void

10
… Ejemplo de herencia
class Class Model

Vehiculo
class Vehiculo
{
# placa: string
# año: int
protected string placa;
protected int año;
+ Vehiculo(string, int)
+ Antiguedad(int): int public Vehiculo(string nPlaca, int nAño)
{
placa = nPlaca;
año = nAño;
Auto }
public int Antiguedad(int añoActual)
- descapotable: bool
{
+ Auto(string, int, bool)
+ Mostrar(): string
return añoActual - año;
}
}
11
Durante la implementación del constructor de una
clase derivada, se puede invocar al constructor de la
clase base.

class Auto:Vehiculo //herencia


{
private bool descapotable;
public Auto(string nPlaca, int nAño, bool descapotable):base(nPlaca, nAño)
{
//placa = nPlaca;
//año = nAño;
this.descapotable = descapotable;
}
public string Mostrar()
{
return "Placa:" + this.placa + ", año: " + this.año + ", Descapotable: " +
this.descapotable;
}

12
public partial class Form1 : Form
{
Vehiculo v;
Auto a;
public Form1()
{
InitializeComponent();
}
private void btnRegistrarVehiculo_Click(object sender, EventArgs e)
{
string placa = txtPlaca.Text;
int año = Convert.ToInt32(txtAño.Text);
v = new Vehiculo(placa,año);
MessageBox.Show("Antiguedad: " + v.Antiguedad(2022).ToString());
}
private void btnRegistrarAuto_Click(object sender, EventArgs e)
{
string placa = txtPlacaAuto.Text;
int año = Convert.ToInt32(txtAñoAuto.Text);
bool descapotable = cbxDescapotableAuto.Checked;
a = new Auto(placa, año, descapotable);
MessageBox.Show("Antiguedad: " + a.Antiguedad(2022).ToString());
MessageBox.Show(a.Mostrar());
}
}

13
Redefinición de métodos
class vehiculo
{

public virtual void mostrar() Para redefinir metodos
{ heredados a la subclase,

se deben declarar con la
}
palabra reservada virtual
}
en la superclase, y con
class auto:vehiculo override en la subclase.
{

public override void mostrar()
{

}
}
14
Ejemplo de Redefinición de Métodos
class Vehiculo
{ protected string placa;
protected int año;
public Vehiculo(string nPlaca, int nAño) //constructor
{
placa = nPlaca;
año = nAño;
}
public int Antiguedad(int añoActual)
{
return añoActual - año;
}
public virtual string Mostrar()
{
return this.placa + ", " + this.año;
}
}

15
… Ejemplo de Redefinición de Métodos
class Auto:Vehiculo //herencia
{
private bool descapotable;
public Auto(string nPlaca, int nAño, bool nDescapotable):base(nPlaca, nAño)
{
descapotable = nDescapotable;
}
public override string Mostrar()
{
return "Placa:" + this.placa + ", año: " + this.año +
", Descapotable: " + this.descapotable;
}
}

16
class herenciaMultiple

HERENCIA MÚLTIPLE #
Vehiculo

placa: string
# año: int

+ Vehiculo(string, int)
+ Antiguedad(int): int
■ Es una estructura jerárquica en la que + Mostrar(): string

una clase tiene dos padres.


■ Ejemplo: La Clase AutoFórmula1 Auto

■ En C# la herencia múltiple de ésta # descapotable: bool

+ Auto(string, int, bool)


manera. + Mostrar(): string

AutoFormula1

- velMaxima: int
- color: string

+ AutoFormula1()
+ AutoFormula1(string, int, bool, int, string)
+ Pintar(string): void
+ Mostrar(): string

17
class herenciaMultiple
class AutoFormula1:Auto
Vehiculo
{
private int velMaxima; # placa: string
# año: int
private string color;
+ Vehiculo(string, int)
+ Antiguedad(int): int
public AutoFormula1():base("HTG-368", 2020, false) + Mostrar(): string

{
this.velMaxima = 200; //km/h
this.color = "rojo"; Auto

} # descapotable: bool
public AutoFormula1 (string nroPlaca, int anio, bool descap, int velMax, + Auto(string, int, bool)
+ Mostrar(): string
string color):base(nroPlaca,anio,descap)
{
this.velMaxima = velMax;
this.color = color;
AutoFormula1
}
- velMaxima: int
public void Pintar(string nuevoColor) - color: string
{ + AutoFormula1()
this.color = nuevoColor; + AutoFormula1(string, int, bool, int, string)
+ Pintar(string): void
} + Mostrar(): string
public override string Mostrar()
{
return "Placa:" + this.placa + ", año: " + this.año + ", Descapotable: " + this.descapotable +
"Vel.Max: " + this.velMaxima + ", Color: " + this.color;
}
}
18
class vehiculo
{
protected string placa;
protected string color;
protected int anio;
protected string modelo;

public vehiculo(string newPlaca, string newColor, int newAnio,string newModelo)


{
placa = newPlaca;
color = newColor;
anio = newAnio;
modelo = newModelo;
}
public virtual void mostrar( ListBox lista)
{
lista.Items.Add("***** Vehiculo placa:" + placa + " *****");
lista.Items.Add("Color:" + color);
lista.Items.Add("Año:" + anio);
lista.Items.Add("Modelo:" + modelo);
}
}
19
class automovil:vehiculo
{
private bool descapotable;

public automovil(string newPlaca, string newColor, int newAnio,


string newModelo, bool newDescapotable):base(newPlaca, newColor, newAnio, newModelo)
{
descapotable = newDescapotable;
}

public override void mostrar(ListBox lista)


{
base.mostrar(lista);
lista.Items.Add("Descapotable:" + descapotable);
}
}

20
class Modelo de clases

Implementar la siguiente estructura de clases persona

# carnet: long
# nombre: string
# apellidoPaterno: string
# apellidoMaterno: string

+ persona(long, string, string, string)


+ mostrar() : string
«property»
+ CARNET() : long
+ NOMBRE() : string
+ APELLIDO_PATERNO() : string
+ APELLIDO_MATERNO() : string

cliente

- telefono: long

+ cliente(long, string, string, string, long)


+ mostrar() : string
+ generarCodigo() : long
«property»
+ TELEFONO() : long

21
Polimorfismo
■ Existen varias formas de polimorfismo: Triangulo objTri = new Triangulo();
– Cuando invocamos el mismo objTri.Dibujar();
nombre de método sobre
instancias de distinta clase.
– Cuando creamos múltiples
constructores. Circulo objCir = new Circulo();
objCir.Dibujar();
– Cuando vía subtipo asignamos una
instancia de una subclase a una
referencia a la clase base.

22
class Modelo de clases

…Polimorfismo # carnet: long


persona

# nombre: string

■ Surge como resultado de la herencia.


# apellidoPaterno: string
# apellidoMaterno: string

■ Un objeto Hijo puede redefinir los métodos +


+
persona(long, string, string, string)
mostrar() : string
heredados del objeto Padre. «property»
+ CARNET() : long
■ Por tanto el hijo puede tomar la forma del padre o la + NOMBRE() : string
+ APELLIDO_PATERNO() : string
forma del hijo. + APELLIDO_MATERNO() : string

■ Por lo que podrá realizar operaciones de varias


formas.
■ Ejemplo: en una estructura de Persona – Cliente cliente

(Clase derivada) - telefono: long

Persona objPersona= new Cliente(); +


+
cliente(long, string, string, string, long)
mostrar() : string
objPersona.Mostrar(); + generarCodigo() : long
«property»
+ TELEFONO() : long
ObjPersona tiene acceso a todo lo métodos
implementados en persona. Y de la clase derivada, se
ejecuta el cuerpo
POO
de los métodos redefinidos. 23
Ejemplo de Polimorfismo
class Modelo de dominio utilizando la siguiente estructura de herencia…

Vehiculo

- placa: string
- codigoColor: int
- año: int
- codigoModelo: int

+ modificar(int, int, int, string) : void


+ mostrar(listBox) : void

Auto Camión
- descapotable: bool - tonelaje: int
- nroRuedas: int
+ modificar(string, bool, int, int, int) : void
+ motrar(listBox) : void + modificar(string, int, int, int, int, int) : void
+ mostrar(listBox) : void

24
class vehiculo
{
protected string placa;
protected string color;
protected int anio;
protected string modelo;

public vehiculo(string placa, string color, int anio, string modelo)


{
this.placa = placa;
this.color = color;
this.anio = anio;
this.modelo = modelo;
}
public virtual void mostrar( ListBox lista)
{
lista.Items.Add("--------------------------------------------");
lista.Items.Add("Placa:" + placa);
lista.Items.Add("Color:" + color);
lista.Items.Add("Año:" + anio);
lista.Items.Add("Modelo:" + modelo);
}
} 25
class automovil:vehiculo
{
private bool descapotable;
public automovil(string placa, string color, int anio, string modelo,
bool descapotable):base(placa,color,anio,modelo)
{
this.descapotable = descapotable;
}
public override void mostrar(ListBox lista)
{
base.mostrar(lista);
lista.Items.Add("Descapotable:" + descapotable);
}
}

26
27
private void mostrarVehiculos(vehiculo objVehiculo)
{
objVehiculo.mostrar(listBox1);
}

private void btnMostrarAuto_Click(object sender, EventArgs e)


{
automovil objAuto1 = new automovil("173 SWF", "Perla", 2011, "Nissan-March", false);
mostrarVehiculos(objAuto1);
}

private void button1_Click(object sender, EventArgs e)


{ //Mostrar vehiculo
vehiculo objVehiculo1 = new vehiculo("896 AVS", "Rojo", 2017, "Toyota-Corolla");
mostrarVehiculos(objVehiculo1);

}
28
Ejemplo 2 de Polimorfismo
private void btnMostrar_Click(object sender, EventArgs e)
{
cliente objeto = new cliente();
objeto.setCarnet(123456);
objeto.setNombre("Pepe");
objeto.setApellidoPaterno("Stark");
objeto.setApellidoMaterno("Cuellar");
objeto.setTelefono("70800001");
objeto.setCorreo("pepe@gmail.com");
mostrar(objeto);

persona objPersona = new persona();


objPersona.setCarnet(3789683);
objPersona.setNombre("Gabriela");
objPersona.setApellidoPaterno("Rodriguez");
objPersona.setApellidoMaterno("Eguez");
mostrar(objPersona);
}
private void mostrar(persona objeto)
{
lbxLista.Items.Add(objeto.getDatos());

} 29
Interface
■ Una interface contiene solo las firmas de métodos y propiedades.
■ Una clase que implemente la interface debe implementar los miembros
de la interface especificados.
interface IEjemploInterface
{
void simpleMetodo();
}

class ClaseImplementadora: IEjemploInterface


{
// Implementación del método explicito de la interface:
void IEjemploInterface.simpleMetodo()
{ // implementación de método
}
}

30
Ejemplo dedeInterface
class Modelo clases

«interface»
IFigura

+ dibujar(Form) : void
+ area() : double

circulo triangulo

- radio: int - basse: int


- altura: int
+ dibujar(Form) : void
+ area() : double + dibujar(Form) : void
+ diametro() : double + area() : double
31
interface IFiguraGeometrica
{
void dibujar(Form Form1);
double area(); Ejemplo de Interface
}
class circulo:IFiguraGeometrica
{
int radio;
public circulo(int r) //crea un circulo de radio r
{
radio = r;
}
public void dibujar(Form Form1)
{
Graphics objGrafico;
objGrafico = Form1.CreateGraphics(); //especificamos donde se graficara
objGrafico.DrawEllipse(new Pen(Color.Blue, 5), new Rectangle(100, 100, radio, radio));
}
public double area()
{
return (Math.PI * Math.Pow(radio,2));
}
}
32
class triangulo : IFiguraGeometrica
{ int basse;
int altura;
public triangulo(int b, int a) //crea un circulo de radio r
{ basse = b;
altura = a;
}
public double area()
{
return (basse*altura/2);
}
public void Dibujar(Form Form1)
{
Graphics objGrafico;
objGrafico = Form1.CreateGraphics(); //especificamos donde se graficara
Point[] puntos = new Point[3]; //Point(x,y)
int x = 100, y = 100;
puntos[0] = new Point(x, y); //vertice inicial del triangulo
puntos[1] = new Point(x+basse,y);
puntos[2] = new Point(x,y-altura);
Pen objLapiz = new Pen(Color.Blue, 3);
objGrafico.DrawPolygon(objLapiz, puntos);

} 33
private void button1_Click(object sender, EventArgs e)
{
circulo c1 = new circulo(10);
c1.dibujar(this); //enviando como argumento el form1
}

private void button2_Click(object sender, EventArgs e)


{
triangulo t1 = new triangulo(200, 100);
t1.dibujar(this);
}

34
Ejercicio Propuesto:
Elaborar la clase Cuadrado para implemente la interface IFigura
class Modelo de clases

«interface»
IFigura

+ Dibujar(Form): void
+ Area(): double

circulo triangulo Cuadrado

- radio: int - basse: int - lado: int


- altura: int
+ Dibujar(Form): void + Cuadrado()
+ Area(): double + Dibujar(Form): void + Dibujar(Form): void
+ Diametro(): double + Area(): double + Area(): double
+ Diametro(): double

35
Clase abstracta
■ Se caracteriza por tener abstract class claseAbstracta
algunos de sus métodos {
declarados como
abstractos.
tipoDato1 Atributo1;
tipoDatoN AtributoN;
■ Un método abstracto,
está definido, pero no
tiene cuerpo. public tipoDato metodo1(argumentos)
■ No se puede crear
{ …. }
objetos de una clase public abstract tipo metodo2(argumentos);
abstracta, ya que tiene }
métodos que no están class derivada: claseAbstracta
definidos.
{
public override tipo metodo2(argumentos)
{ …. }

}
36
Ejemplo: Implementación la clase
abstracta Lector
class Class Model

Lector

- ci: int
- nombre: string
- apellidoPaterno: string
- apellidoMaterno: string
- edad: int

+ Lector(int, string, string, string, int)


+ Mostrar(): string
+ CumplirAños(): void

Docente Estudiante

- profesion: string - Registro: int


+ Docente(int, string, string, string, int, string) + Estudiante(int, string, string, string, int, int)
+ Mostrar(): string + Mostrar(): string

37
Ejemplo de Clase Abstracta

abstract class Lector


{
protected int ci, edad;
protected string nombre, apellidoPaterno, apellidoMaterno;
public Lector(int carnet, string nombre, string aPaterno, string aMaterno, int edad)
{
this.ci = carnet;
this.nombre = nombre;
this.apellidoPaterno = aPaterno;
this.apellidoMaterno = aMaterno;
this.edad = edad;
}
public void CumplirAños()
{
edad++;
}
public abstract string Mostrar();
}

38
class Docente:Lector
{
private string profesion;

public Docente(int carnet, string nombre, string aPaterno, string aMaterno,


int edad, string profesion):base(carnet, nombre, aPaterno, aMaterno, edad)
{
this.profesion = profesion;
}
public override string Mostrar()
{
return ci.ToString() + " " + nombre + " " + apellidoPaterno + " " +
apellidoMaterno + " " + edad.ToString() + " años " + profesion;
}

39
40
public partial class Form1 : Form
{ Docente doc;
public Form1()
{ InitializeComponent();
}
private void btnGuardar_Click(object sender, EventArgs e)
{
int ci = Convert.ToInt32(txtCI.Text);
string nombre = txtNombre.Text;
string aPaterno = txtAPaterno.Text;
string aMaterno = txtAMaterno.Text;
int edad = Convert.ToInt32(txtEdad.Text);
string profesion = txtProfesion.Text;
doc = new Docente(ci, nombre, aPaterno, aMaterno, edad, profesion);
listBox1.Items.Add(doc.Mostrar());
// Lector lec = new Lector(ci, nombre, aPaterno, aMaterno, edad);
//ERROR no se crear un objeto de la clase abstracta
}
private void btnCumplirAños_Click(object sender, EventArgs e)
{ doc.CumplirAños();
listBox1.Items.Add(doc.Mostrar());

}
41
Ejercicio Propuesto:
class Class Model

Lector

■ Desarrollar la - ci: int


- nombre: string
clase Estudiante, - apellidoPaterno: string
que implemente - apellidoMaterno: string
- edad: int
la clase abstracta
Lector. +
+
Lector(int, string, string, string, int)
Mostrar(): string
+ CumplirAños(): void

Docente Estudiante

- profesion: string - Registro: int


+ Docente(int, string, string, string, int, string) + Estudiante(int, string, string, string, int, int)
+ Mostrar(): string + Mostrar(): string

42
COMPARACION ENTRE CLASE, CLASE
ABSTRACTA E INTERFACE
CARACTERÍSTICAS CLASE CLASE INTERFACE
ABSTRACTA
Tiene atributos SI SI NO
Implementa métodos SI SI NO
Tiene solo declaración de métodos NO SI SI
(que no tiene implementación solo
está la cabecera)
Se pueden crear objetos o instancias SI NO NO
Puede tener clases derivadas SI SI SI

43

También podría gustarte