Documentos de Académico
Documentos de Profesional
Documentos de Cultura
POLIMORFISMO
Unidad 4
Ing. Yoelma Melendres
yymelendresf@doc.emi.edu.bo
CRITERIO DE DESEMPEÑO
2
CONTENIDO
Ejemplo: -
Vehiculo
placa: string
- codigoColor: int Superclase
- año: int
- codigoModelo: int
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()
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.
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
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;
20
class Modelo de clases
# carnet: long
# nombre: string
# apellidoPaterno: string
# apellidoMaterno: string
cliente
- 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
# nombre: string
Vehiculo
- placa: string
- codigoColor: int
- año: int
- codigoModelo: int
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;
26
27
private void mostrarVehiculos(vehiculo objVehiculo)
{
objVehiculo.mostrar(listBox1);
}
}
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);
} 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();
}
30
Ejemplo dedeInterface
class Modelo clases
«interface»
IFigura
+ dibujar(Form) : void
+ area() : double
circulo triangulo
} 33
private void button1_Click(object sender, EventArgs e)
{
circulo c1 = new circulo(10);
c1.dibujar(this); //enviando como argumento el form1
}
34
Ejercicio Propuesto:
Elaborar la clase Cuadrado para implemente la interface IFigura
class Modelo de clases
«interface»
IFigura
+ Dibujar(Form): void
+ Area(): 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
Docente Estudiante
37
Ejemplo de Clase Abstracta
38
class Docente:Lector
{
private string 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
Docente Estudiante
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