You are on page 1of 21

IV.

POLIMORFISMO
Es la habilidad que poseen los objetos para reaccionar de modo diferente ante los mismos mensajes. El polimorfismo se refiere a la posibilidad de definir mltiples clases con funcionalidad diferente, pero con mtodos o propiedades denominados de forma idntica, que pueden utilizarse de manera intercambiable mediante cdigo cliente en tiempo de ejecucin.

En C# el polimorfismo est ntimamente relacionado con la sobrecarga y mtodos virtuales.

MTODOS VIRTUALES

Son mtodos en la clase base pensados para ser sobre-escritos por subclases. Para declararlos, se utiliza la palabra reservada virtual Para sobreescribirlos, en la subclase se utiliza la palabra reservada override. Un mtodo virtual PUEDE ser sobreescrito, o utilizarse tal como est. Solo se puede utilizar override si el mtodo en la clase base est marcado como virtual, abstract u override. El mtodo override debe mantener el mismo nivel de acceso que el mtodo Virtual correspondiente

Sucede cuando una clase B hereda caractersticas de una clase A, pero la clase B redefine las caractersticas heredadas de A.

Ejemplo:

class Vehiculo { public virtual void Arrancar() { System.Console.WriteLine("Arrancar...Clase Vehiculo");} } class Carro: Vehiculo

{
public override void Arrancar() { System.Console.WriteLine("Arrancar....Clase Carro");} } class Programa

{
static void Main( strings []arg) { Carro miCarro = new Carro(); miCarro.Arrancar(); System.Console.ReadLine();}

EVITAR LA SOBREESCRITURA DE UN MTODO


Agregar sealed a un mtodo override impide la futura sobre-escritura de ese mtodo, proporcionando una implementacin final. class Aparato { public virtual void Prender() { System.Console.WriteLine(" Prendiendo el Aparato ");} } class TV : Aparato { public override sealed void Prender() { System.Console.WriteLine(" LA TV SE ESTA PRENDIENDO ");} } class TVColor : TV { public override void Prender()//ERROR { System.Console.WriteLine(" La tele a color se esta prendiendo");} }

OCULTAR METODOS HEREDADOS


Es posible ocultar un mtodo heredado e introducir uno nuevo a la jerarqua de clases. El mtodo antiguo (heredado) es reemplazado por otro nuevo,diferente, pero con el mismo nombre y la misma firma. class Vehiculo { public void Arrancar() { System.Console.WriteLine(" Clase Vehiculo. Metodo Arrancar ");} }
class Automovil : Vehiculo { public new void Arrancar() { System.Console.WriteLine(" Clase Automovil. Metodo Arrancar ");} }

CLASES ABSTRACTAS

Son clases que NO pueden ser instanciadas.

Se utilizan solamente para heredar de ellas (Forzar la herencia).


Se antepone la palabra abstract a la clase.

MTODOS ABSTRACTOS

Las clases abstractas pueden definir mtodos y propiedades abstractos, con lo que su respectiva implementacin en la subclase es obligatoria. Los elementos abstractos DEBEN ser sobreescritos en la subclase Se utiliza abstract para definir elementos abstractos (solo dentro de clases abstractas). Los elementos abstractosNO proporcionan implementacin; solo declaraciones. En la subclase, se utiliza override para realizar la implementacin correspondiente.

public abstract class ClaseAbstractaPersona { string Nombre; DateTime FechaNacimiento; public abstract void Comer(); public int CalcularEdad() { //Aqu se implementa este mtodo } }

IMPLEMENTACIN DE CLASES ABSTRACTAS


abstract class Persona

{
private string nombre; private string apellido; public string Nombre { get { return nombre; } set { nombre = value; } } public string Apellido { get { return apellido; }

class Empleado : Persona { private int claveEmpleado; public override int Clave { get { return claveEmpleado; } set { claveEmpleado = value; }}
public override string consultarTodosLosDatos() { return "------Datos del Empleado: \n" + this.Clave + " " + this.Nombre + " " + this.Apellido; }}

class Cliente : Persona { set { apellido = value; } private int claveCliente; } public override int Clave public abstract int Clave { get { return claveCliente; } { get; set; } public abstract string ConsultarTodosLosDatos();set { claveCliente = value; }}
public string ObtenerNombreCompleto() { return this.Nombre + " " + this.Apellido; } }

public override string ConsultarTodosLosDatos() { return "******Datos del Cliente: \n" + this.Clave + " " + this.Nombre + " " + this.Apellido; }}

EJERCICIO:
Una agencia de renta de vehculos dispone de autobuses y tractores. La renta de autobuses se factura por kilmetros. Debido a esto, los datos de la clase Autobs son:

El precio por kilmetro. La cantidad de kilmetros que tiene el autobs cuando se renta. La cantidad de kilmetros que tiene el autobs cuando se devuelve.

En cambio, la renta de tractores se factura por das. Debido a esto, los datos de la clase Tractor son:

El precio por da. La fecha de su renta (obtenido de la fecha y hora del sistema). La fecha de su devolucin (obtenido de la fecha y hora del sistema).

Cuando se rente un vehculo, se deben capturar sus placas, sus datos correspondientes (de acuerdo al tipo de vehculo), marcarlo como alquilado (asignando el valor booleano true a la propiedad respectiva) y mostrar sus datos mediante un messageBox. Cuando se devuelve un vehculo, se elimina la marca de alquilado (asignando el valor booleano false a la propiedad correspondiente), se calcula el importe a pagar por la renta y se muestran sus datos mediante un messageBox. Disee una forma como la que se muestra a continuacin, donde active y desactive los controles indicados dependiendo del tipo de vehculo seleccionado:

Al oprimir cualquiera de los botones se deben desplegar los datos del vehculo correspondiente segn la operacin indicada mediante messageBoxes como los que se muestran enseguida:

UTILIZANDO ELEMENTOS ABSTRACTOS


abstract class Persona { private string nombre; private string apellido; public string Nombre { get { return nombre; } set { nombre = value; } } public string Apellido { get { return apellido; } set { apellido = value; } } public abstract int Clave //se define { get; set; } public abstract string ConsultarTodosLosDatos(); // public string ObtenerNombreCompleto() { return this.Nombre + " " + this.Apellido; } } class Empleado : Persona { private int claveEmpleado; public override int Clave { get { return claveEmpleado; } set { claveEmpleado = value; } } public override string ConsultarTodosLosDatos() { return "------Datos del Empleado: \n" + this.Clave + " " + this.Nombre + " " + this.Apellido; }} class Cliente : Persona { private int claveCliente; public override int Clave { get { return claveCliente; } set { claveCliente = value; } } public override string ConsultarTodosLosDatos() { return "******Datos del Cliente: \n" + this.Clave + " " + this.Nombre + " " + this.Apellido; }}

4.3 INTERFACES

Son mecanismos para que puedan interactuar varios objetos no relacionados entre s Al igual que las clases abstractas, son plantillas de comportamiento que deben ser implementados por otras clases. Una interfaz posee declaraciones de propiedades y mtodos, pero NO realiza ninguna implementacin. Es un contrato expresado para que posteriormente lo implemente quien se suscriba a l.

INTERFACES No posee variables ni constantes. No puede heredar de otra clase, pero s de otras interfaces. Una clase que herede de una interfaz debe implementar todas las definiciones contenidas en ella. Los elementos de la interfaz no llevan los modificadores public o virtual.

TODOS los elementos declarados dentro de una interfaz se consideran pblicos y virtuales.

IMPLEMENTACIN DE INTERFACES, HERENCIA DE INTERFACES.


interface IFecha {

int Dia();
int Mes(); string MesConLetra(); int Ao(); }

class ClaseCheques : IFecha { // Implementacin de los mtodos de la interfaz IFecha public int Dia( ) { return DateTime.Now.Day; } public int Mes( ) { return DateTime.Now.Month; } public int Ao( ) { return DateTime.Now.Year; } public string MesConLetra( ) { switch ( Mes( ) ) { case 1: return ("Enero"); break; case 2: return ("Febrero"); break; case 12: return ("Diciembre"); break; }}}

HERENCIA DE DOS INTERFACES


interface ICuadrado { double Lado { get; set; } } interface IFiguraOperaciones { double CalcularArea(); double CalcularPerimetro(); } public class Figura { public virtual string ConsultarDatos() { return "Datos de la Figura: "; } }
class Cuadrado : Figura, ICuadrado, IFiguraOperaciones { private double L; public double Lado { get { return L; } set { L = value; } } public double CalcularArea() { return Lado * Lado; } public double CalcularPerimetro() { return 4 * Lado; } public override string ConsultarDatos() { return " Datos : Lado = " + Lado; }} class Program { static void Main() { Cuadrado c = new Cuadrado(); c.Lado = 2; System.Console.WriteLine( c.ConsultarDatos() ); System.Console.WriteLine("Area: " + c.CalcularArea()); System.Console.WriteLine("Perimetro: " + c.CalcularPerimetro()); System.Console.ReadLine(); }}

EJEMPLO DE INTERFACES DE C#
Icomparable. Contiene la declaracin del mtodo CompareTo() interface IComparable { int CompareTo(object obj); } El mtodo CompareTo() devuelve un valor entero como resultado de laco mparacin Iequatable Contiene la declaracin del mtodo Equals() interface IEquatable<T> { bool Equals(T obj); } El mtodo Equals() devuelve un valor booleano como resultado de la comparacin IEnumerable

4.4 VARIABLES POLIMRFICAS (PLANTILLAS): DEFINICIN, USO Y APLICACIONES.

4.5 REUTILIZACIN DE CDIGO.

You might also like