Está en la página 1de 34

Polimorfismo en C#. Redefinicin de mtodos, mtodos abstractos y virtuales. Mtodos genricos, operadores relacionados al polimorfismo.

Sobrecarga de funciones y operadores

Temas
Mtodos abstractos y virtuales Clases abstractas Sobrecarga de mtodos y operadores Polimorfismo en c# Uso de polimorfismo mediante mtodos

genricos

Clase pasada
Que significa instanciar una clase? Cuales son las principales ventajas de la herencia? A que llambamos encapsulamiento de miembros? Que problemas provocaban la utilizacin del encapsulamiento de atributos en las clases? Cuales palabras se utilizaban para definir el acceso a los miembros de una clase? Que significa cada una?

Bibliografa
Antonio Gonzlez Saco Programming Microsoft Windows with C#. Charles Petzold C# design patterns, a tutorial. Addison Wesley
El lenguaje de programacion c sharp. Jose

Jerarqua de clases hipottica

Especulacin cientfica
Es esto posible en C#?
Figura MyFigure1 = new Circulo(); Figura MyFigure2 = new Cuadrado(); Figura MyFigure3 = new Poligono(); Figura MyFigure4 = new Amorfo();

Polimorfismo
Es la capacidad de almacenar objetos de un determinado tipo en variables de tipos antecesores del primero, a costa esto de slo poderse acceder a travs de dicha variable a los miembros comunes a ambos tipos.

Mtodos virtuales
Ya hemos visto que es posible definir tipos cuyos mtodos se hereden de definiciones de otros tipos. Lo que ahora vamos a ver es que adems es posible cambiar dicha definicin en la clase hija. A este tipo de mtodos se les llama mtodos virtuales.

Mtodos virtuales
Clase Base virtual <tipoDevuelto> <nombreMtodo>(<parmetros>) { <cdigo> } Clase Derivada override <tipoDevuelto> <nombreMtodo>(<parmetros>) { <nuevoCdigo> }

Mtodos abstractos
Es una variante de mtodo virtual que no es programado en la clase base y obliga al programador a redefinirlo en la clase derivada si desea que esta clase pueda ser instanciada. Toda clase que contenga algn mtodo abstracto o que herede uno y no lo redefina ser una clase abstracta

Mtodos abstractos
abstract Class Base abstract <tipoDevuelto> <nombreMtodo>(<parmetros>) { <cdigo> } Class Derivada override <tipoDevuelto> <nombreMtodo>(<parmetros>) { <nuevoCdigo> }

Clases abstractas
Una clase abstracta es aquella que forzosamente se ha de derivar si se desea que se puedan crear objetos de la misma. Puede o no contener mtodos abstractos pero toda clase que contenga mtodos abstractos debe ser definida como abstracta. Para ello se antepone la palabra abstract a la definicin de clase

Operadores
Object is Class: Devuelve true si el objeto Object es del tipo de Class Object as Class: En nuestro caso se utilza para tratar al objeto Object del tipo de una clase base como un objeto de una clase derivada. Tiene otros usos.

Aterrizando. Un caso de estudio.


Se desea desarrollar un programa que lleve algunas estadsticas relacionadas con las personas que trabajan y estudian en una universidad. Para esto utilizaremos como base la jerarqua de clases que hemos desarrollado en las conferencias.

Problema
Se asumir que el cumpleaos de los estudiantes coincide con el da de graduacin del curso. En ese caso si su promedio es mayor a 2 puntos debe pasar de curso.

Problema
Se asumir que el cumpleaos de los empleados coincide con el da de comienzo en su empleo, se desea incrementar sus aos de experiencia en 1 y su salario en 20.

Problema
Se han realizado algunas pequeas modificaciones a las clases de la jerarqua para hacerlas ms cortas y rpidas de escribir. Por ejemplo se han definido todos los atributos como pblicos, se han eliminado las propiedades y algunos atributos no relevantes

Como lo hacemos?
Person
Name Age Initials Birthday() Salary Workplace Profession YearsOfExperience

Employee
School Course Speciality Grade

Student

class Person { public public public public {

string Name; string Initial; int Age; void Birthday() Age++;

} public Person() { Name=""; Initial=""; } public Person(string aName, int anAge) { Name=aName; Initial=aName.Substring(0,1); Age=anAge; } }

class Student: Person { public string College; public int Course; public double Grade; public string Speciality; public Student(string aName, string aCollege, string aSpeciality, int anAge) :base(aName, anAge) { College=aCollege; Speciality=aSpeciality; Course=1; } }

class Employee: Person { public string WorkPlace; public double Salary; public int YearsOfExperience; public string Profession; public Employee(string aName, string aWorkPlace, string aProfession, float aSalary, int anAge): base(aName, anAge) { WorkPlace=aWorkPlace; Profession=aProfession; Salary=aSalary; YearsOfExperience=0; } }

Metodos virtuales
Person
Name Age Initials Birthday() Salary Workplace Profession YearsOfExperience Birthday()

Employee

Student

School Course Speciality Grade Birthday()

Como definir mtodos virtuales


El mtodo birthday se definir como virtual para ser reescrito en las clases derivadas debido a que tiene que realizar funciones diferentes segn sea la clase. Para eso se utilizar la palabra reservada virtual

class Person { public string Name; public string Initial; public int Age;

virtual
{

public void Birthday()

Age++; } public Person() { Name=""; Initial=""; } public Person(string aName, int anAge) { Name=aName; Initial=aName.Substring(0,1); Age=anAge; } }

Como reescribir mtodos virtuales


Para reescribir el mtodo virtual birthday en las clases derivadas utilizamos la palabra reservada override. La palabra reservada base permite invocar la versin de este mtodo que se implement en la clase base.

class Student: Person { public string College; public int Course; public double Grade; public string Speciality;

override public void Birthday() { base.Birthday(); if (Grade>2) Course++; }


public Student(string aName, string aCollege, string aSpeciality, int anAge) :base(aName, anAge) { College=aCollege; Speciality=aSpeciality; Course=1; } }

class Employee: { public public public public

Person string WorkPlace; double Salary; int YearsOfExperience; string Profession;

override public void Birthday() { base.Birthday(); YearsOfExperience++; Salary+=20; }


public Employee(string aName, string aWorkPlace, string aProfession, float aSalary, int anAge): base(aName, anAge) { WorkPlace=aWorkPlace; Profession=aProfession; Salary=aSalary; YearsOfExperience=0; } }

Como utilizar el polimorfismo


Utilizaremos un mtodo genrico que reciba un tipo Person y le pasaremos tipos Person pero que contengan objetos de tipo Student y Employee. Observen el uso de los operadores is y as.

public static void Stats(Person aPerson) { Console.WriteLine("---"); Console.WriteLine("Nombre:{0}", aPerson.Name); Console.WriteLine("Edad:{0}", aPerson.Age); if (aPerson is Student) { Console.WriteLine("Escuela:{0}", (aPerson as Student).College); Console.WriteLine("Carrera:{0}", (aPerson as Student).Speciality); Console.WriteLine("Promedio:{0}", (aPerson as Student).Grade); Console.WriteLine(Curso:{0}", (aPerson as Student).Course); } else if (aPerson is Employee) { Console.WriteLine("Centro de Trabajo:{0}", (aPerson as Employee).WorkPlace); Console.WriteLine("Profesion:{0}", (aPerson as Employee).Profession); Console.WriteLine("Salario:{0}", (aPerson as Employee).Salary); Console.WriteLine("Anyos de Exp:{0}", (aPerson as Employee).YearsOfExperience); } }

Como utilizar el polimorfismo


En el mtodo Main crearemos dos objetos de tipo Student y Employee y los almacenaremos en un tipo Person. Ese tipo se lo pasaremos al mtodo genrico. Observamos como se comportan las dos clases de manera diferente a la hora de invocar el mtodo Birthday, y como el mtodo genrico Stats las trata de manera diferente gracias a los operadores.

public static void Main(string[] args) { Person aStudent=new Student("Juan", "Cujae", "Tele", 18); (aStudent as Student).Grade=5; Person anEmployee=new Employee("Jose", "Cujae", "Profe", 350, 24); Stats(aStudent); Stats(anEmployee); aStudent.Birthday(); anEmployee.Birthday(); Stats(aStudent); Stats(anEmployee); Console.ReadLine(); }

Salida en la consola

Resumen
El polimorfismo es una de las herramientas

ms poderosas que brinda la POO. Permite a los programadores tratar a objetos de una misma jerarqua de clases de la misma manera y con el mismo algoritmo y sin embargo que estos se comporten de manera diferente. Para esto se vale de la redefinicin de mtodos virtuales y abstractos

Estudio Individual
Estudiar el tema 11 del libro de texto de la

asignatura donde se tratan los temas de redefinicin de operadores para clases.

También podría gustarte