12-polimorfismo en c#

45
Polimorfismo en C# V1.0 Febrero 2014 Ferreiras Providing a single interface to entities of different types. . BS” 1

Upload: leonarneoma1

Post on 23-Nov-2015

86 views

Category:

Documents


3 download

TRANSCRIPT

Polimorfismo en C#

Polimorfismo en C#V1.0Febrero 2014Ferreiras

Providing a single interface to entities of different types. . BS 12Polimorfismo Es cuando un mtodo con un mismo nombre se puede procesar de diferentes maneras.

El polimorfismo es uno de los conceptos fundamentales de la programacin orientada a objetos, POO3Polimorfismo El polimorfismo proporciona las siguientes caractersticas :

Permite a una clase proporcionar diferentes implementaciones de mtodos que son llamados a travs del mismo nombre. Esto es llamado polimorfismo esttico.

Permite invocar los mtodos de clases derivadas mediante una referencia a su clase base en tiempo de ejecucin. Esto es llamado polimorfismo dinmico. 4Polimorfismo El polimorfismo es de dos tipos:

Polimorfismo esttico / Sobrecarga de mtodos

Polimorfismo dinmico / Sobreescritura de mtodos. 5Polimorfismo esttico La vinculacin se produce en tiempo de compilacin;

Se implementa con la sobrecarga de mtodos, en una misma clase.6

Sobrecarga de mtodos

La sobrecarga de mtodos ( overloading methods ) Significa definir dos o ms mtodos dentro de la misma clase, los cuales tienen el mismo nombre, pero con diferentes declaraciones de parmetros. Los tipos de retornos podrn ser iguales o diferentes. Lo nico que se toma en cuenta son los nombres de los mtodos y sus listas de parmetros. 7 Cuando un mtodo sobrecargado se invoca, utiliza el tipo y / o nmero de argumentos como gua para determinar qu versin del mtodo sobrecargado debe llamar. Cuando se encuentra una llamada a un mtodo sobrecargado, simplemente se ejecuta la versin del mtodo cuyos parmetros coincidan con los argumentos utilizados en la llamada8 /* polimoStatic0.cs csc.exe 3.5

Ferreiras / C# / Polimorfismo esttico sobrecarga de mtodos (Overloading )

*/

using System;

class Sobrecargada { public void fofi(string cad1) { Console.WriteLine("\n\t=> " + cad1 ); }

public void fofi(string cad, string cad2) { Console.WriteLine( "\n\t=> Concatenando: " + cad + " " + cad2 ); }

public double fofi(double salarioAnual) { Console.WriteLine("\n\t=> Salario anual: " + salarioAnual ); return salarioAnual/12; }}Obsrvese que el mtodo fofi () es sobrecargado 3 veces.9polimoStatic0.cs

public class Tester {

public static void Main() {

Sobrecargada sobrecarga = new Sobrecargada(); double salarioMensual; sobrecarga.fofi("El monigote de la ONU"); sobrecarga.fofi( "Ban-Kimoon, el monigote US" , " y de la OTAN" ); salarioMensual = sobrecarga.fofi(435237.12); Console.WriteLine("\n\t=> Salario Mensual = " + salarioMensual ); }}

10polimoStatic0.cs

D:\Ferreiras2\C#, Mi Codigo C#>csc polimoStatic0.csMicrosoft (R) Visual C# 2008 Compiler version 3.5.30729.1for Microsoft (R) .NET Framework version 3.5Copyright (C) Microsoft Corporation. All rights reserved.

D:\Ferreiras2\C#, Mi Codigo C#> polimoStatic0

=> El monigote de la ONU

=> Concatenando: Ban-Kimoon, el monigote US y de la OTAN

=> Salario anual: 435237.12

=> Salario Mensual = 36269.76

D:\Ferreiras2\C#, Mi Codigo C#>

11 Tienen diferentes listas de parmetros; Los tipos de retorno pueden ser iguales o diferentes. No importa; Pueden cambiar el modificador de acceso; Pueden declarar nuevas o ms amplias excepciones; Pueden estar en la misma clase o en una clase derivada; La sobrecarga de mtodos no tiene nada que ver con la herencia y mtodos virtuales. En resumen, los mtodos sobrecargados:FerreirasPolimorfismo en JAVA12Polimorfismo esttico Polimorfismo esttico, vinculacin temprana, sobrecarga de mtodos Son todos sinnimos. La sobrecarga de mtodos es la forma en que C# implementa el polimorfismo esttico. 12FerreirasPolimorfismo en JAVA13Polimorfismo esttico Como hemos vista ya es posible definir dos o ms mtodos de la misma clase que comparten el mismo nombre, siempre y cuando sus declaraciones de parmetros sean diferentes. Cuando este es el caso, los mtodos se dice que estn sobrecargadas, y el proceso se conoce como sobrecarga del mtodo, como ya vimos. 13FerreirasPolimorfismo en JAVA14Polimorfismo esttico Los mtodos sobrecargados deben diferenciarse en el tipo y / o nmero de sus parmetros y, aunque pueden tener diferentes tipos de retorno, el tipo de retorno por s solo no es insuficiente para distinguir dos versiones de un mtodo. 14FerreirasPolimorfismo en JAVA15Polimorfismo esttico Cuando se encuentra una llamada a un mtodo sobrecargado, simplemente ejecuta la versin del mtodo cuyos parmetros coincidan con los argumentos utilizados en la llamada. Cuando un mtodo sobrecargado es invocado, se utiliza el tipo y / o nmero de argumentos como gua para determinar qu versin del mtodo sobrecargado para llamar realidad. 1516Polimorfismo dinmico Es la propiedad que tienen objetos pertenecientes a diferentes clases, Derivadas de una misma clase Base, de poder responder a un mismo mensaje de diferentes formas;

En C#, el polimorfismo dinmico se implementa con la sobreescritura de mtodos mediante la herencia y mtodos virtuales y, tambin, por va de interfaces .17 Sobreescritura de mtodos La sobreescritura de mtodos ( methods overriding ) es una nueva definicin, en una clase derivada, de un mtodo no static ya definido en la clase base. El mtodo sobrescrito tendr en la clase derivada el mismo modificador, el mismo tipo de retorno, el mismo nombre y la misma lista de parmetros, pero cuerpo diferente.18 En situaciones en las que sea necesario usar de manera explcita el mtodo de la clase base podemos usar la palabra reservada base y para llamar de manera expresa un mtodo del objeto actual podemos usar la palabra reservada this. La nueva definicin del mtodo no puede reducir la accesibilidad del mtodo original, pero si puede ampliarla.19/* polimorDinam0.cs

Ferreiras / C# / Polimorfismo / Polimorfismo dinmico /Overriding

*/

using System;

/////////////////

class Animal {

public virtual void mover() { Console.WriteLine("\n\t=> Un animal se mueve !!\n"); }}

20polimorDinam0.cs

class Perro : Animal {

public override void mover() { base.mover(); // invoca el metodo mover de la clase base Console.WriteLine("\n\t=> AVISO: Los perros pueden caminar, correr y morder\n"); }

public void ladrar() { Console.WriteLine("\n\t=> URGENTE !! Estoy ladrando\n"); }

}

21polimorDinam0.cs

//////////////

class Polimorfismo0 {

public static void Main( ){

Animal unAnimal = new Perro(); // a una refBase le es asignada un objDerivada unAnimal.mover(); // Ejecuta el metodo en la clase Perro // unAnimal.ladrar(); // Ver NOTA 1

}}

//////////////////22polimorDinam0.cs

D:\Ferreiras2\C#, Mi Codigo C#>csc polimorDinam0.csMicrosoft (R) Visual C# 2008 Compiler version 3.5.30729.1for Microsoft (R) .NET Framework version 3.5Copyright (C) Microsoft Corporation. All rights reserved.

D:\Ferreiras2\C#, Mi Codigo C#>polimorDinam0

=> Un animal se mueve !!

=> AVISO: Los perros pueden caminar, correr y morder

D:\Ferreiras2\C#, Mi Codigo C#>23/*polimorDinam0.cs

NOTA 1

D:\Ferreiras2\C#, Mi Codigo C#>csc polimorDinam0.cs

Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.1for Microsoft (R) .NET Framework version 3.5Copyright (C) Microsoft Corporation. All rights reserved.

polimorDinam0.cs(68,16): error CS1061: 'Animal' does not contain a definition for 'ladrar' and no extension method 'ladrar' accepting a first argument of type 'Animal' could be found (are you missing a using directive or an assembly reference?)

D:\Ferreiras2\C#, Mi Codigo C#>

*/24 En resumen, para sobreescribir los mtodos en la clase base: Los mtodos debe ser virtual Los mtodos virtual o abstract no pueden ser private Un mtodo declarado static no puede ser marcado como override, virtual o abstrac Si un mtodo no puede ser heredado, este no puede ser sobreescrito; La lista de parmetros en el mtodo sobreescrito debe ser exactamente la misma que la lista del mtodo en la clase base; El tipo de retorno en el mtodo sobreescrito debe ser exactamente el mismo tipo que el del mtodo en la clase base o un subtipo de este. Un constructor no puede ser sobreescrito;FerreirasPolimorfismo en JAVA25Polimorfismo dinmico La vinculacin tarda Hace posible que, con un mtodo declarado en una clase base (o en una interface) y sobreescrito en las clases derivadas (o en clases que implementan la interface), sea el tipo de objeto, y no el tipo de la referencia lo que determine qu definicin del mtodo se va a ejecutar.

El tipo de objeto al que apunta una referencia solo puede conocerse en tiempo de ejecucin , y es por eso que el polimorfismo dinmico necesita la vinculacin tarda o dinmica. 25FerreirasPolimorfismo en JAVA26Polimorfismo dinmico El polimorfismo dinmico Significa que cuando un mtodo es llamado, la llamada al mtodo es vinculada al cuerpo del mtodo en el momento de ejecutar el programa, dinmicamente. En este caso, el compilador no sabe qu mtodo es llamado en el momento de la compilacin. Por lo tanto, esto tambin se llama "polimorfismo en tiempo de ejecucin" o "enlace dinmico. Otro nombre es Vinculacin tarda Es la capacidad de vincular una variable de referencia a ms de un tipo de objeto.26Polimorfismo dinmico27 El polimorfismo dinmico esta asociado a una variable polimrfica de referencia; Variable polimrfica Es una variable que puede referenciar mas de un tipo de objeto, en distintos momentos de la ejecucin de un programa ). Polimorfismo dinmico28Por ejemplo:ClaseBase variableDeReferencia;variableDeReferencia= new ClaseDerivada1();= new ClaseDerivada2();= new ClaseDerivada(); variableDeReferencia Es, entonces, una variable polimrfica porque, en este caso, esta referenciando varios objetos de las Derivadas de la Base. 29/*polimorDinam1.cscsc.exe 3.5

Ferreiras / C# / Polimorfismo dinmico, overriding

*/

using System;

////////////////////class Animal {

public virtual void hablar() { Console.WriteLine("\n\t=> Animal hablando\n"); }}30polimorDinam1.cs

////////////////class Mamifero : Animal {

public override void hablar(){ Console.WriteLine("\n\t=> Mamifero hablando\n"); }}

///////////////class Caballo : Mamifero {

public override void hablar(){ Console.WriteLine("\n\t=> Caballo hablando\n"); }}

///////////////31polimorDinam1.cs

class Murcielago : Mamifero { public override void hablar(){ Console.WriteLine("\n\t=> Murcielago hablando\n"); }}

32polimorDinam1.cs

/////////////

class Tester { public static void Main() { Animal refAnimal;

refAnimal = new Animal(); refAnimal.hablar();

refAnimal = new Mamifero(); refAnimal.hablar();

refAnimal = new Caballo(); refAnimal.hablar();

refAnimal = new Murcielago(); refAnimal.hablar(); }}El Principio de Sustitucin de Liskow

Si se tiene una variable cuyo tipo es una superclase, el programa debera funcionar correctamente si se coloca una instancia de esa superclase o cualquiera de sus subclases en dicha la variable.

El programa que utiliza la variable antes indicada no debera ser capaz de decir qu clase se est utilizando, en tiempo de ejecucin.33polimorDinam1.cs

D:\Ferreiras2\C#, Mi Codigo C#>csc polimorDinam1.csMicrosoft (R) Visual C# 2008 Compiler version 3.5.30729.1for Microsoft (R) .NET Framework version 3.5Copyright (C) Microsoft Corporation. All rights reserved.

D:\Ferreiras2\C#, Mi Codigo C#> polimorDinam1

=> Animal hablando

=> Mamifero hablando

=> Caballo hablando

=> Murcielago hablando

D:\Ferreiras2\C#, Mi Codigo C#>

Polimorfismo dinmico en C# va interface34 Se implementa declarando variables de referencia con el tipo de la interface.

Posteriormente, se le asigna un objeto de cualquier clase que implemente la interface usada como tipo en la variable de referencia.

Utilizando la misma variable de referencia se puede invocar mtodos de diferentes clases que implementen la interface usada.Polimorfismo dinmico en C# va interface35 As, podremos utilizar los mtodos de la interface, va la variable de referencia a la que le fuese asignado un objeto de la clase que la implement, sin mas que conocer el actual tipo de objeto.

Tngase en cuenta que la clase que implemente la interface debe implementar todos los mtodos declarados en esta ultima. 36 Por ejemplo:/* polimorInterface0.cs csc.exe 3.5

Ferreiras / C#/ Polimorfismo / Polimorfismo dinmico va uso de interface

El nombre de una interface se puede utilizar para declarar el tipo de una variable, el valor de la variable puede ser (de referencia) a un objeto de cualquier clase que implemente esta interfaz. As, podremos utilizar los mtodos de la interface, va la variable de referencia a la que le fuese asignado un objeto de dicha clase, sin mas que conocer el actual tipo de objeto.

Tngase en cuenta que la clase que implemente la interface debe implementar todos los mtodos declarados en esta ultima.

*/

37polimorInterface0.cs

using System;

// Declaramos la interface

interface IProfesorEstudiante { void elProfesor(); }

// Implementamos la interface

class Profesor : IProfesorEstudiante { public void elProfesor() { // Como ve el Estudiante al Profesor Console.WriteLine("\n\t* Estudiante => El profesor es el Guru de esto !!\n"); }

}38polimorInterface0.cs

class Estudiante : IProfesorEstudiante { public void elProfesor() { // Como ve el Profesor al Estudiante Console.WriteLine("\n\t* El Profesor => Todos tienen un 70 !!\n"); }}

class Escuela : IProfesorEstudiante { public void elProfesor() { // Como ve la escuela el profesor Console.WriteLine("\n\t* La Escuela y la ANEUINF => No debes faltar a clase !!\n"); } public double evaluacionProfesor() { // metodo que NO esta en la interface double evaluacion = 70; return evaluacion; }}39polimorInterface0.cs

class Tester { public static void Main() { IProfesorEstudiante varRef; varRef = new Profesor(); varRef.elProfesor(); varRef = new Estudiante(); varRef.elProfesor(); varRef = new Escuela(); varRef.elProfesor();

// varRef.evaluacionProfesor(); // ERROR, ver NOTA 1 }}

Obsrvese que usamos la misma variable de referencia del tipo de la interface para ir asignndole objetos de las clases que la implementan y poder invocar sus respectivos mtodos. Eso tambin es polimorfismo dinmico40polimorInterface0.cs

D:\Ferreiras2\C#, Mi Codigo C#>csc polimorInterface0.csMicrosoft (R) Visual C# 2008 Compiler version 3.5.30729.1for Microsoft (R) .NET Framework version 3.5Copyright (C) Microsoft Corporation. All rights reserved.

D:\Ferreiras2\C#, Mi Codigo C#> polimorInterface0

* Estudiante => El profesor es el Guru de esto !!

* El Profesor => Todos tienen un 70 !!

* La Escuela y la ANEUINF => No debes faltar a clase !!

D:\Ferreiras2\C#, Mi Codigo C#>

41polimorInterface0.cs

NOTA 1

D:\Ferreiras2\C#, Mi Codigo C#>csc polimorInterface0.csMicrosoft (R) Visual C# 2008 Compiler version 3.5.30729.1for Microsoft (R) .NET Framework version 3.5Copyright (C) Microsoft Corporation. All rights reserved.

polimorInterface0.cs(69,19): error CS1061: 'IProfesorEstudiante' does not contain a definition for 'evaluacionProfesor' and no extension method 'evaluacionProfesor' accepting a first argument of type 'IProfesorEstudiante' could be found (are you missing a using directive or an assembly reference?)

D:\Ferreiras2\C#, Mi Codigo C#>

La causa de este error es que intentamos usar la variable de referencia ,varRef, con un mtodo que no esta declarado en la interface usada como tipo de la variable.42EJEMPLOS...43EJERCICIOS...Referencias Types (C# Programming Guide) http://msdn.microsoft.com/en-us/library/ms173104.aspx C# Concisely; Judith Bishop, Nigel Hospool; Pearson, Addison Wisley 2003.

Head First C#; Andrew Stellman and Jennifer Greene ; Second Edition; OReilly Media, 2010.

Desarrollo de aplicaciones .NET con Visual C#; Miguel Rodrguez Gmez-Stern, Marcos Antonio Besteiro Gorostizaga; McGra2-Hill/Interamericana de Espaa, S.A.U., 2002.

Visual C# Language http://msdn.microsoft.com/en-us/library/aa287558(v=vs.71).aspx

...

4445

GRACIAS