4. Polimorfismo

download 4. Polimorfismo

of 37

Transcript of 4. Polimorfismo

POLIMORFISMO

Mtodos Virtuales Clases Abstractas Interfaces

PolimorfismoSignifica literalmente muchas formas. Es el concepto segn el cual un mtodo declarado en una clase base se puede utilizar de muchas formas diferentes en las distintas clases derivadas.

PolimorfismoEl nombre del mtodo reside en la clase base Los distintos cuerpos del mtodo residen en las clases derivadasMsico de cuerda AfinaTuInstrumento( ) Un mtodo sin cuerpo se llama operacin

Guitarrista AfinaTuInstrumento( )

Violinista AfinaTuInstrumento( )

MTODOS VIRTUALEAS

Implementacin de mtodosDefinicin de mtodos virtuales Uso de mtodos virtuales Sustitucin de mtodos (override) Uso de mtodos override

Definicin de mtodos virtualesUn mtodo virtual especifica una implementacin de un mtodo que puede ser sustituida por polimorfismo en una clase derivada. Del mismo modo, un mtodo virtual no especifica la nica implementacin de un mtodo. No es posible sustituir por polimorfismo un mtodo no virtual en una clase derivada.

Definicin de mtodos virtualesSintaxis: Se declara como virtualclass Token { ... public int LineNumber( ) { ... } public virtual string Name( ) { ... } }

Un mtodo virtual debe contener un cuerpo cuando se declara Los mtodos virtuales son polimrficos

Uso de mtodos virtualesPara usar mtodos virtuales: No

se puede declarar mtodos virtuales como estticos No se puede declarar mtodos virtuales como privados

Sustitucin de mtodos (override)Un mtodo override especifica otra implementacin de un mtodo virtual. Los mtodos virtuales definidos en una clase base pueden ser sustituidos por polimorfismo en una clase derivada.

Sustitucin de mtodos (override)Sintaxis: Se usa la palabra reservada overrideclass Token { ... public virtual string Name( ) { ... } } class ComentToken: Token { ... public override string Name( ) { ... } }

Uso de mtodos overrideclass Token { ... public int LineNumber( ) { ... } public virtual string Name( ) { ... } } class ComentToken: Token { ... public override int LineNumber( ) { ... } public override string Name( ) { ... } }

Slo se sustituyen mtodos virtuales heredados idnticos Un mtodo override debe coincidir con su mtodo virtual asociado Se puede sustituir un mtodo override No se puede declarar explcitamente un override como virtual No se puede declarar un mtodo override como static o private

CLASES ABSTRACTAS

Uso de clases abstractasDeclaracin de clases abstractas Implementacin de mtodos abstractos Uso de mtodos abstractos

Clases base abstractasAlgunas clases existen slo para ser clases base No

tiene sentido crear instancias de estas clases Estas clases son abstractasNo se pueden crear instancias de clases abstractas Se pueden crear instancias de clases concretas

Msico de cuerda { abstract }

Guitarrista concrete

Violinista concrete

Clases base abstractasEn una jerarqua de clases, la operacin (el nombre de un mtodo) se declara en la clase base y el cuerpo del mtodo se escribe de diferentes maneras en las distintas clases derivadas. La clase base existe nicamente para introducir el nombre del mtodo en la jerarqua. Se necesita un mecanismo que haga imposible la creacin de instancias de estas clases base : marcar la clase base como abstracta. Las clases abstractas se emplean para proporcionar implementaciones parciales de clases que se completan con clases derivadas concretas. Las clases abstractas son especialmente tiles para la implementacin parcial de una interfaz que puede ser reutilizada por varias clases derivadas.

Declaracin de clases abstractasSe usa la palabra reservada abstractabstract class Token { ... } class Test { static void Main( ) { new Token( ); } }

Token { abstract }

No se pueden crear instancias de una clase abstracta

Uso de clases abstractas en una jerarqua de clases

Ejemplo 1

abstract class Token { ... } class ComentToken: Token { ... } class KeywordToken: Token { ... }

Token { abstract }

Coment Token concrete

Keyword

Token concrete

Clases abstractasLa utilidad de las clases abstractas es que pueden contener mtodos para los que no se d directamente una implementacin sino que se deje en manos de sus clases hijas darla. No es obligatorio que las clases abstractas contengan mtodos de este tipo, pero s lo es marcar como abstracta a toda la que tenga alguno. Estos mtodos se definen precediendo su definicin del modificador abstract y sustituyendo su cdigo por un punto y coma (;). Obviamente, como un mtodo abstracto no tiene cdigo no es posible llamarlo. Hay que tener especial cuidado con esto a la hora de utilizar this para llamar a otros mtodos de un mismo objeto, ya que llamar a los abstractos provoca un error al compilar. todo mtodo definido como abstracto es implcitamente virtual, pues si no sera imposible redefinirlo para darle una implementacin en las clases hijas de la clase abstracta donde est definido. Por ello es necesario incluir el modificador override a la hora de darle implementacin y es redundante marcar un mtodo como abstract y virtual a la vez (de hecho, hacerlo provoca un error al compilar) Es posible marcar un mtodo como abstract y override a la vez, lo que convertira al mtodo en abstracto para sus clases hijas y forzara a que stas lo tuviesen que reimplementar si no se quisiese que fuesen clases abstractas.

Implementacin de mtodos abstractosSintaxis: Se usa la palabra reservada abstractabstract class Token { public virtual string Name( ) { ... } public abstract int Longitud( ); } class ComentToken: Token { public override string Name( ) { ... } public override int Longitud( ) { ... } }

Slo clases abstractas pueden declarar mtodos abstractos Los mtodos abstractos no pueden tener cuerpo

Uso de mtodos abstractosLos mtodos abstractos son virtuales Los mtodos override pueden sustituir a mtodos abstractos en otras clases derivadas Los mtodos abstractos pueden sustituir a mtodos de la clase base declarados como virtuales Los mtodos abstractos pueden sustituir a mtodos de la clase base declarados como override

INTERFACES

Uso de interfacesDeclaracin de interfaces Implementacin de varias interfaces Implementacin de mtodos de interfaz

InterfaceUna interfaz especifica un contrato sintctico y semntico al que estn sujetas todas las clases derivadas. Ms concretamente, en ese contrato la interfaz describe el qu, mientras que las clases que implementan la interfaz describen el cmo. Una interfaz contiene slo las firmas de mtodos, delegados o eventos. La implementacin de los mtodos se hace en la clase que implementa la interfaz.

InterfaceLas interfaces describen un grupo de comportamientos relacionados que pueden pertenecer a cualquier clase o estructura. Las interfaces pueden estar compuestas de mtodos, propiedades, eventos, indizadores o cualquier combinacin de estos cuatro tipos de miembros. Una interfaz no puede contener campos. Los miembros de interfaz son automticamente pblicos. Al igual que las clases se pueden heredar de una clase base o estructura, las clases y estructuras se pueden heredar de interfaces, con dos excepciones:

Una clase o estructura puede heredar ms de una interfaz. Cuando una clase o la estructura hereda una interfaz, hereda slo los nombres de mtodo y las firmas, ya que la propia interfaz no contiene ninguna implementacin.

Para implementar un miembro de interfaz, el miembro correspondiente de la clase debe ser pblico, no esttico y tener el mismo nombre y la misma firma que el miembro de interfaz. Las propiedades e indizadores de una clase pueden definir descriptores de acceso adicionales para una propiedad o indizador definidos en una interfaz. Por ejemplo, una interfaz puede declarar una propiedad con un descriptor de acceso get, pero la clase que implementa la interfaz puede declarar la misma propiedad con descriptores de acceso get y set. Sin embargo, si la propiedad o el indizador utiliza una implementacin explcita, los descriptores de acceso deben coincidir. Las interfaces y los miembros de interfaz son abstractos; las interfaces no proporcionan una implementacin predeterminada. Las interfaces pueden heredar otras interfaces. Es posible que una clase herede una interfaz varias veces, a travs de las clases base o interfaces que hereda. En ese caso, la clase slo puede implementar la interfaz una vez, siempre que sta se declare como parte de la nueva clase. Si la interfaz heredada no est declarada como parte de la nueva clase, la clase base que la declar proporcionar su implementacin. Es posible que una clase base implemente miembros de interfaz a travs de miembros virtuales. En ese caso, la clase que hereda la interfaz puede cambiar el comportamiento de la interfaz reemplazando los miembros virtuales.

Informacin general sobre interfacesUna interfaz tiene las siguientes propiedades:

Una interfaz es similar a una clase base abstracta. Cualquier tipo no abstracto que hereda la interfaz debe implementar todos sus miembros. No se pueden crear instancias directamente de una interfaz. Las interfaces pueden contener eventos, mtodos, indizadores y propiedades (declaraciones sin cuerpo). Las interfaces no contienen implementaciones de mtodos. Las clases y estructuras se pueden heredar de ms de una interfaz. Una interfaz se puede heredar de varias interfaces.

Declaracin de interfacesUna interfaz en C# se parece a una clase que no tiene cdigo y se declara de forma similar, pero se usa la palabra reservada interface en vez de class.Los nombres de interfaces empiezan con Imayscula Imayscula

interface IToken { int LineNumber( ); string Name( ); }Sin espec. de acceso espec. Mtodos sin cuerpo

IToken interface LineNumber( ) Name( )

Caractersticas de las interfacesLos mtodos de interfaz son implcitamente pblicos.interface IToken { public int LineNumber ( ); }

// Error al compilar

Los mtodos que se declaran en una interfaz no pueden contener cuerpo.interface IToken { int LineNumber ( ) { ... } }

// Error al compilar

Ejemplointerface ISampleInterface { void SampleMethod(); } class ImplementationClass : ISampleInterface { // Explicit interface member implementation: void ISampleInterface.SampleMethod() { // Method implementation. } static void Main() { // Declare an interface instance. ISampleInterface obj = new ImplementationClass(); // Call the member. obj.SampleMethod(); } }

namespace interface_empleado { interface Iemployee { string Name { get; set; } int Counter { get; } } public class Employee : Iemployee { public static int numberOfEmployees; private string name; public string Name // read-write instance property { get { return name; } set { name = value; } } private int counter; public int Counter // read-only instance property { get { return counter; } } public Employee() // constructor { counter = ++counter + numberOfEmployees; } }

class TestEmployee { static void Main() { Console.Write("Enter number of employees: "); Employee.numberOfEmployees = int.Parse(Console.ReadLine()); Employee e1 = new Employee(); Console.Write("Enter the name of the new employee: ); e1.Name = Console.ReadLine(); Console.WriteLine("The employee information:"); Console.WriteLine("Employee number: {0}, e1.Counter); Console.WriteLine("Employee name: {0}", e1.Name); } } }

Entrada 210 Hazem Abolrous Resultados del ejemplo Enter number of employees: 210 Enter the name of the new employee: Hazem Abolrous The employee information: Employee number: 211 Employee name: Hazem Abolrous

Implementacin de varias interfacesUna clase puede implementar cero o ms interfaces

interface IToken { IToken IVisitable string Name( ); interface interface } interface IVisitable CVC1 { void Accept(IVisitante v); } class Token: IToken, IVisitable Token { ... concrete }Una interfaz puede extender cero o ms interfaces Una clase puede ser ms accesible que sus interfaces base Una interfaz no puede ser ms accesible que su interfaz base Una clase implementa todos los mtodos de interfaz heredados

Slide 31 CVC1 Todas las declaraciones de mtodos deben nombrar los parmetrosCurro Vzquez, 4/20/2003

Implementacin de mtodos de interfazEl mtodo que implementa debe ser igual que el mtodo de interfaz El mtodo que implementa puede ser virtual o no virtualclass Token: IToken, IVisitable { public virtual string Name( ) { ... } public void Accept(IVisitante v) { ... } }Mismo acceso Mismo retorno Mismo nombre Mismos parmetros

EjemploLa implementacin explcita de interfaces tambin permite al programador implementar dos interfaces que tienen los mismos nombres de miembros y dar a cada miembro de una interfaz una implementacin independiente. Este ejemplo muestra las dimensiones de un cuadro, tanto en unidades mtricas como inglesas. La claseBox implementa dos interfaces, IEnglishDimensions e IMetricDimensions, que representan los diferentes sistemas de medida. Ambas interfaces tienen nombres de miembros idnticos, Length y Width.

Ejemplousing System; using System.Collections.Generic; using System.Linq; using System.Text; namespace interfaces_prueba { // Declare the English units interface: interface IEnglishDimensions { float Length(); float Width(); } // Declare the metric units interface: interface IMetricDimensions { float Length(); float Width(); } // Declare the Box class that implements the two interfaces: // IEnglishDimensions and IMetricDimensions: class Box : IEnglishDimensions, IMetricDimensions { float lengthInches; float widthInches; public Box(float length, float width) { lengthInches = length; widthInches = width; } // Explicitly implement the members of IEnglishDimensions: float IEnglishDimensions.Length() { return lengthInches; } float IEnglishDimensions.Width() { return widthInches; } // Explicitly implement the members of IMetricDimensions: float IMetricDimensions.Length() { return lengthInches * 2.54f; } float IMetricDimensions.Width() { return widthInches * 2.54f; }

Cont..static void Main() { // Declare a class instance box1: Box box1 = new Box(30.0f, 20.0f); // Declare an instance of the English units interface: IEnglishDimensions eDimensions = (IEnglishDimensions)box1; // Declare an instance of the metric units interface: IMetricDimensions mDimensions = (IMetricDimensions)box1; // Print dimensions in English units: Console.WriteLine("Length(in): {0}", eDimensions.Length()); Console.WriteLine("Width (in): {0}", eDimensions.Width()); // Print dimensions in metric units: Console.WriteLine("Length(cm): {0}", mDimensions.Length()); Console.WriteLine("Width (cm): {0}", mDimensions.Width()); } } }

Resultados Length(in): 30 Width (in): 20 Length(cm): 76.2 Width (cm): 50.8

Para que sirve una interfazSe utiliza para definir un protocolo de conducta que puede ser implementado por cualquier clase en una jerarquia de clases. La utilidad que esto pueda tener puede resumirse en lo siguiente:Captar similitudes entre clases no relacionadas sin forzar entre ellas una relacion artificial. Una accion de este tipo permitiria incluso, definir una matriz de objetos de esas clases y aplicar, si fuese necesario, la definicion de polimorfismo. Declarar metodos que una o mas clases deben implementar en determinadas situaciones. Publicar la interfaz de programacin de una clase sin descubrir como esta implementada.