Está en la página 1de 37

Programacin Orientada a Objetos con C#

Programacin Orientada a Objetos en C#

Ing. Ramn Roque Hernndez, M.C. ramon@ramonroque.info


1

Cmo declarar una clase


class nombre_de_la_clase { contenido de la clase }

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

Dentro de la clase
Se pueden declarar variables, propiedades, mtodos, etc. Cada elemento puede tener un modificador de acceso. Un Modificador de acceso especifica quienes estn autorizados a ver ese elemento. Si no se especifica ningn modificador de acceso, se asume que se trata de un elemento private.
3

Modificadores de acceso
public
Accesible a todos los elementos

private
Accesible solo a esa misma clase

protected
Accesible solo a la misma clase y mtodos de sus clases derivadas. No accesible desde el exterior.

internal
Accesible solo a ese ensamblado

protected internal
Accesible desde el mismo ensamblado, la misma clase y mtodos de sus clases derivadas

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

Modificadores de acceso
Accesible desde Modificador de acceso Clase donde se declar Subclase (Mismo assembly) Subclase (Distinto Assembly) Externamente (Mismo Assembly) Externamente (Distinto Assembly)

private

SI

NO

NO

NO

NO

internal

SI

SI

NO

SI

NO

protected protected internal public

SI

SI

SI

NO

NO

SI

SI

SI

SI

NO

SI

SI

SI

SI

SI 5

Ejemplo: Variables con Modificadores de acceso


class claseA { //Si no se indica, es private int numero; private int numero1; public int numero2; protected int numero3 = 99; internal int numero4; protected internal int numero5; }

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

Campos
Un campo es un dato comn a todos los objetos de una determinada clase. Las variables declaradas dentro de una clase son ejemplos de campos (fields).

Crear objetos: Instanciacin


Una vez creada la clase, ya es posible consumirla mediante la instanciacin. La instanciacin es el proceso de crear objetos a partir de una clase.
1.

Ejemplo en dos pasos:


claseA miobjetoA; miobjetoA = new claseA();

2.

3.

Ejemplo en un paso:

Definir el tipo de miObjetoA Adquirir memoria sin inicializar para el nuevo objeto usando new. Ejecutar el constructor para inicializar la memoria y convertirla en un objeto usable

claseA miobjetoA = new claseA();


8

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

Variables: Por valor


Las variables de los tipos de datos bsicos (primitivos) se crean en el STACK. Se dice que son manejados por valor.
int num1; num1 = 50;

STACK

STACK

num1

No definido

num1

50

Objetos: Por referencia


Los objetos se crean en el HEAP. En el STACK solo se guarda una referencia a la direccin del HEAP donde se encuentran. Se dice que son manejados por referencia.
Cliente cli; cli = new Cliente();

STACK

STACK

HEAP

cli

No definido

cli

[ Referencia cli ]

objeto cli

10

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

Objetos: Por referencia


Cliente cli2 = new Cliente();

cli2 = cli solo copia las referencias, no copia los objetos.

STACK

HEAP El objeto cli2 queda sin referencias hacia l .


cli2 = cli;

cli

[ Referencia cli ] [ Referencia cli2 ]

objeto cli

objeto cli2

cli2

STACK

HEAP

cli

[ Referencia cli ] [ Referencia cli2 ]

objeto cli

objeto cli2

cli2

11

Accediendo a los miembros de los objetos


Asignacin: miobjetoA . Numero2 = 50;
Nombre del objeto Seleccin Miembro

Lectura: miOtraVariable = miobjetoA . Numero2;


12

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

Mtodos

13

Mtodos
Contienen instrucciones para ejecutar al momento de ser invocados. Un mtodo contiene:
Modificador de Acceso (Determina su visibilidad) Tipo de dato (Devuelto al finalizar su ejecucin) Identificador (Nombre con el cual se invoca) Parmetros (Cero o mas variables que recibe el mtodo)

14

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

Ejemplo de mtodo
Modificador de acceso Tipo de dato del valor regresado

Identificador

Parmetros

class Carro { public void Encender() { System.Console.WriteLine("El Auto se ha encendido!"); } }


15

Invocando al mtodo

Carro miCarro = new Carro(); miCarro.Encender();

Nombre del objeto

Nombre del mtodo

Parmetros

16

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

Mtodos que retornan valores


El Tipo de dato del mtodo NO es void. Dentro del mtodo debe haber una sentencia return con algn valor del tipo de dato del mtodo. Ejemplo (Al declararlo): public string ConsultarEstado() { return estado; } Al llamar al mtodo (desde el programa):
string estado_actual = miCarro.ConsultarEstado();

17

Mtodos que reciben parmetros


Entre los parntesis se especifican una o mas variables (separadas por comas) con sus respectivos tipos de datos. Esas variables estarn accesibles dentro del mtodo. public void CambiarEstado( string nuevoestado ) Dato { de estado = nuevoestado; entrada }

Al momento de invocar el mtodo, se deben incluir esos valores en la llamada:

miCarro.CambiarEstado(Apagado);
18

Ing. Ramn Roque Hernndez, M.C.

Programacin Orientada a Objetos con C#

this
Para hacer referencia (explcita) a un elemento que se encuentra dentro de la misma clase (sta) se utiliza this.
class Articulo { private double precio = 0; public void PonerPrecio ( double precio ) { this.precio = precio; } public double ConsultarPrecio() { return this.precio; } }

Muy til cuando existen distintos elementos con el mismo nombre, pero con distinto significado dentro de un mbito determinado.
19

Ejemplos de mtodos
class Carro { private string estado = "Apagado"; public void Encender() { estado = "Encendido"; } public void Apagar() { estado = "Apagado"; } public string ConsultarEstado() { return estado; } public void CambiarEstado(string nuevoestado) { estado = nuevoestado; } }
20

Ing. Ramn Roque Hernndez, M.C.

10

Programacin Orientada a Objetos con C#

Ejemplos de llamadas a los mtodos


Continuacin del ejemplo anterior (Clase Carro)
class Programa { static void Main() { Carro miCarro = new Carro(); miCarro.Encender(); System.Console.WriteLine(miCarro.ConsultarEstado()); miCarro.CambiarEstado("En marcha"); System.Console.WriteLine(miCarro.ConsultarEstado()); miCarro.Apagar(); System.Console.WriteLine(miCarro.ConsultarEstado()); System.Console.ReadLine(); } }
21

Sobrecarga
Se refiere a la posibilidad de crear mtodos que posean el mismo nombre y difieran en la cantidad y/o tipo de parmetros (Firma).
No es posible crear 2 funciones con el mismo identificador que solo difieran en el tipo de dato devuelto.
static bool impresion(int num) static char impresion(int num)

No es posible que 2 mtodos sobrecargados solo difieran en el modificador static.

22

Ing. Ramn Roque Hernndez, M.C.

11

Programacin Orientada a Objetos con C#

Ejemplo de sobrecarga
class Impresion { public void Imprimir() { System.Console.WriteLine("Sistema de Usuarios"); } public void Imprimir(string mensaje) { System.Console.WriteLine(mensaje); } public void Imprimir (string titulo, string mensaje) { System.Console.WriteLine("===== " + titulo + " ====="); System.Console.WriteLine(mensaje); } } class Programa { static void Main() { Impresion im = new Impresion (); im.Imprimir(); im.Imprimir("Siga las instrucciones en pantalla", "Use minusculas"); im.Imprimir(" Gracias! "); System.Console.ReadLine(); } } 23

Mtodo Constructor
Mtodo especial que es invocado automticamente cada vez que un objeto nuevo es creado (new). Debe poseer el mismo nombre de la clase. No posee tipo de dato de retorno. Si la clase no posee un constructor, C# crea uno vaco por default.
24

Ing. Ramn Roque Hernndez, M.C.

12

Programacin Orientada a Objetos con C#

Ejemplo de constructor
class Persona { public string Nombre; Constructor. (notar que tiene el mismo nombre de la clase) public Persona() { Nombre = "Desconocido"; } }
Dentro del constructor se realizan las inicializaciones correspondientes

class Programa { static void Main() { Persona unaPersona = new Persona(); System.Console.WriteLine(unaPersona.Nombre); System.Console.ReadLine(); } }

25

Ejemplo de constructor que recibe parmetros


class Persona { public string Nombre; public Persona(string nombreDeLaPersona) { Nombre = nombreDeLaPersona; } } class Programa { static void Main() { Persona otraPersona = new Persona("Ramon"); System.Console.WriteLine(otraPersona.Nombre); System.Console.ReadLine(); } }

Se debe proporcionar el valor de los parmetros al momento de la creacin del objeto.


26

Ing. Ramn Roque Hernndez, M.C.

13

Programacin Orientada a Objetos con C#

Ejemplo: Sobrecarga de Constructor


class Persona { public string Nombre; Constructores public Persona() { Nombre = "Desconocido"; } public Persona(string nombreDeLaPersona) { Nombre = nombreDeLaPersona; } } class Programa { static void Main() { Persona unaPersona = new Persona(); System.Console.WriteLine(unaPersona.Nombre); Persona otraPersona = new Persona("Ramon"); System.Console.WriteLine(otraPersona.Nombre); System.Console.ReadLine(); } }

Dos constructores = Dos diferentes formas de crear objetos

27

Mtodo Destructor
No puede llamarse explcitamente. Se invoca automticamente cuando el objeto es destruido. Invocado por el Garbage Collector (GC) justo antes de desasignar la memoria del objeto. Usado para cerrar archivos, conexiones de red, canales abiertos, etc. Sintaxis similar al mtodo constructor, pero anteponiendo una tilde (~) al nombre.

28

Ing. Ramn Roque Hernndez, M.C.

14

Programacin Orientada a Objetos con C#

Ejemplo de destructor

class Empleado { ~Empleado() { System.Console.WriteLine("Se ha destruido el Empleado "); } }

Un destructor NO puede sobrecargarse, y se ejecuta cuando el recolector de basura destruye el objeto.

29

Destruccin de objetos
C# gestiona la memoria de modo automtico mediante el recolector de basura (Garbage Collector o GC), quien se encarga de eliminar la memoria que en algn momento se solicit y no se ocupa mas. En C# no existe el operador contrario a new. Por lo que, de manera general, NO es posible controlar exactamente el momento en el cual la memoria vuelve a estar disponible.
30

Ing. Ramn Roque Hernndez, M.C.

15

Programacin Orientada a Objetos con C#

Destruccin de objetos
Se puede indicar en el programa cuando un objeto deja de ser util, asignndole el valor null.
miObjeto = null

Cuando el GC lo note, tomar cartas en el asunto. El instante preciso en que lo har, queda fuera del alcance del programador.

31

El Garbage Collector (recolector de basura)


Se asegura que:
Los objetos son destruidos una sola vez Se destruyan objetos que ya no son utilizados.

Trabaja cuando:
Hay poca memoria disponible La aplicacin est finalizando El programador lo invoca manualmente (NO recomendado): System.GC.Collect()

32

Ing. Ramn Roque Hernndez, M.C.

16

Programacin Orientada a Objetos con C#

Propiedades

33

Propiedades
Son valores (variables) que poseen los objetos. Se pueden implementar:
Declarando la variable como public
No sera posible especificarla como Solo-Lectura o Solo-Escritura No se puede implementar cdigo adicional asociado a la Lectura o Escritura de la variable.

Declarando un mtodo de acceso a la variable


Empobrece la legibilidad del cdigo. Puede crear confusin.

Utilizando accesadores get{ } y set { }para las propiedades


Recomendado en C#

34

Ing. Ramn Roque Hernndez, M.C.

17

Programacin Orientada a Objetos con C#

Implementado propiedades con mtodos de acceso


Es la nica opcin en algunos lenguajes de programacin orientados a objetos. En C#.NET existe otra manera mas recomendable.
class Persona { private int edad; public void EstablecerEdad(int a) { edad = a; } public int ConsultarEdad() { return edad; } } class Programa { static void Main() { Persona unaPersona = new Persona(); unaPersona.EstablecerEdad(25); System.Console.WriteLine ("La edad es: " + unaPersona.ConsultarEdad()); } }

35

Implementando propiedades con accesadores get, set


(Manera recomendada)

class Persona { private int edad; public int Edad { get { return edad; } set { edad = value; } } }

class Programa { static void Main() { Persona unaPersona = new Persona(); unaPersona.Edad = 25; System.Console.WriteLine (unaPersona.Edad); } }

36

Ing. Ramn Roque Hernndez, M.C.

18

Programacin Orientada a Objetos con C#

Propiedades de solo lectura


Si se desea que una propiedad sea de solo lectura, solo se debe incluir get.
class Cuenta { private double _saldo=0; public double Saldo { get { return _saldo; } } } class Programa { static void Main() { Cuenta miCuenta = new Cuenta(); //miCuenta.Saldo = 32; System.Console.WriteLine(miCuenta.Saldo); System.Console.ReadLine(); } }

Realizar una asignacin provocara un error


37

Nivel de acceso asimtrico en las propiedades


Si una propiedad posee get y set, entonces uno de los dos puede tener un modificador de acceso explcito. El nivel de acceso explcito de get o set debe ser mas restrictivo que el usado en la propiedad a la que pertenece. No se pueden utilizar en interfaces o implementacin de ellas.
get sigue siendo public
class Empleado { private int _numero; public int Numero { get { return _numero; } private set { _numero = value; } } }

38

Ing. Ramn Roque Hernndez, M.C.

19

Programacin Orientada a Objetos con C#

Herencia y Composicin

39

Herencia
Caracterstica de la POO que permite definir nuevas clases a partir de otras ya existentes. Puede usarse para:
Relaciones del tipo es un
Ejemplo: Un Gerente es un Empleado con caractersticas propias adicionales.

40

Ing. Ramn Roque Hernndez, M.C.

20

Programacin Orientada a Objetos con C#

Uso de la Herencia
Beneficios:
Permte escribir menos cdigo. Mejora la reusabilidad de los componentes. Facilita el mantenimiento del sistema completo.

Util para un buen diseo del programa. Un diseo pobre sin herencia implementara las clases involucradas de manera independiente.

41

Herencia en C#
En C# solo se permite Herencia simple. Ejemplo de Herencia en C#
class A { } class B : A { }
Indica que B Hereda de A

Todos los objetos heredan de System.Object


42

Ing. Ramn Roque Hernndez, M.C.

21

Programacin Orientada a Objetos con C#

Ejemplo de Herencia
Se deben modelar dos clases con las siguientes caractersticas:
Automovil CaballosDeFuerza: int CantidadDePuertas: int Arrancar() : void Detener() : void Acelerar(int cuanto): void PalaMecanica CaballosDeFuerza: int PesoMaximoDeLevante: int Arrancar() : void Detener() : void MoverPala(string direccion) : void

43

Mal Diseo (No recomendable)


Modelarlas de manera independiente.
class PalaMecanica { private int cf, pml; public int CaballosDeFuerza { get { return cf; } set { cf = value; } } public int PesoMaximoDeLevante { get { return pml; } set { pml = value; } } public void Arrancar() { } public void Detener() { } public void MoverPala(string direccion) { } } class Automovil { private int cf, cp; public int CaballosDeFuerza { Iguales get { return cf; } set { cf = value; } } public int CantidadDePuertas { get { return cp; } set { cp = value; } } public void Arrancar() { Iguales } public void Detener() { Iguales } public void Acelerar(int cuanto) { } }

44

Ing. Ramn Roque Hernndez, M.C.

22

Programacin Orientada a Objetos con C#

Diseo usando Herencia (Recomendado)


Vehiculo CaballosDeFuerza : int Arrancar() : void Detener() : void Herencia Subclases (Clases Hijas)
PalaMecanica PesoMaximoDeLevante : int MoverPala(string direccion) : void

Superclase (Clase base)

Automovil CantidadDePuertas : int Acelerar(int cuanto) : void

45

Diseo de las clases usando herencia en C#


class Vehiculo { private int cf; public int CaballosDeFuerza { get { return cf; } set { cf = value; } } public void Arrancar() { } public void Detener() { } } class Automovil : Vehiculo { private int cp; public int CantidadDePuertas { get { return cp; } set { cp = value; } } public void Acelerar(int cuanto) { } } class PalaMecanica : Vehiculo { private int pml; public int PesoMaximoDeLevante { get { return pml; } set { pml = value; } } public void MoverPala(string direccion) { } } 46

Ing. Ramn Roque Hernndez, M.C.

23

Programacin Orientada a Objetos con C#

Notas sobre el ejemplo


Todas las variables, mtodos y propiedades que no sean privadas, sern heredadas. Los elementos heredados se accesan igual que si estuvieran presentes en esa clase.

class Programa { static void Main() { Automovil unAuto = new Automovil(); unAuto.Arrancar(); unAuto.Acelerar(10); unAuto.Detener(); PalaMecanica unaPala = new PalaMecanica(); unaPala.Arrancar(); unaPala.MoverPala ("arriba"); unaPala.Detener(); System.Console.ReadLine(); } }

47

Llamando mtodos de la clase base


Una subclase puede llamar los mtodos de su superclase con la palabra reservada base.

class Vehiculo { public void Arrancar() { System.Console.WriteLine("....Arrancando....Clase Vehiculo... "); } } class Automovil : Vehiculo { public void Acelerar(int cuanto) { System.Console.WriteLine("Primero, hay que arrancar"); base.Arrancar(); System.Console.WriteLine("Despues, hay que acelerar..."); System.Console.WriteLine("Acelerando "+ cuanto + " km/hr"); } } class Programa { static void Main() { Automovil miCarro = new Automovil(); miCarro.Acelerar(10); System.Console.ReadLine(); } 48 }

Ing. Ramn Roque Hernndez, M.C.

24

Programacin Orientada a Objetos con C#

Secuencia de ejecucin de constructores en la Herencia


Considerar el siguiente ejemplo Qu salida se obtiene?
class A { public A() { System.Console.WriteLine(" Constructor de la clase A"); } } class B : A { public B() { System.Console.WriteLine(" Constructor de la clase B"); } } class C : B { public C() { System.Console.WriteLine(" Constructor de la clase C "); } } class programa { static void Main() { C miObjetoC = new C(); } } 49

Secuencia de ejecucin de constructores en la Herencia


Salida del programa Constructor de la clase A Constructor de la clase B Constructor de la clase C Al crear una instancia de C, Primero se ejecuta el constructor de la clase padre (Que en realidad siempre es Object), luego el constructor de la clase A, despus el constructor de la clase B, y finalmente el constructor de la clase C System.Object

50

Ing. Ramn Roque Hernndez, M.C.

25

Programacin Orientada a Objetos con C#

Invocando constructores de la clase base


class Punto { public int x, y; public Punto(int puntoX, int puntoY) { x = puntoX; y = puntoY; } } class Circulo : Punto { public double r; public Circulo(int coordX, int coordY, double radio) :base (coordX, coordY) { r = radio; } public string ConsultarDatos() { return string.Format("X={0} Y={1} R ={2} ",x,y,r); } } class Programa { public static void Main() { Circulo c = new Circulo(1, 2, 1); System.Console.WriteLine(c.ConsultarDatos()); System.Console.ReadLine(); } }

La salida del programa es


X=1 Y=2 R =1

La palabra reservada base( ) hace referencia a la clase padre inmediata desde la cual se invoca. Entre parntesis se especifican los parmetros requeridos.

51

Secuencia de ejecucin de los destructores usando herencia


class A { public A() { System.Console.WriteLine("Constructor de la clase A"); } ~A() { System.Console.WriteLine("Destructor de la clase A"); } } class B : A { public B() { System.Console.WriteLine("Constructor de la clase B"); } ~B() { System.Console.WriteLine("Destructor de la clase B"); } } class C : B { public C() { System.Console.WriteLine("Constructor de la clase C "); } ~C() { System.Console.WriteLine("Destructor de la clase C"); } }

class programa { static void Main() { C miObjetoC = new C(); } }

52

Ing. Ramn Roque Hernndez, M.C.

26

Programacin Orientada a Objetos con C#

Secuencia de ejecucin de los destructores usando herencia


La salida del programa es
Constructor de la clase A Constructor de la clase B Constructor de la clase C Destructor de la clase C Destructor de la clase B Destructor de la clase A

Los destructores son invocados en orden inverso a los constructores.

53

Composicin
Un objeto puede tener como miembro otro objeto definido previamente. Cuando un objeto se encuentra compuesto por otros objetos, se dice que hay Composicin. La composicin permite implementar relaciones del tipo tiene un.
Ejemplo: Un Auto tiene un Motor.

54

Ing. Ramn Roque Hernndez, M.C.

27

Programacin Orientada a Objetos con C#

Composicin
ProcesosDeUsuario Impresion

class Impresion { public void Imprimir(string Titulo, string mensaje) { System.Console.WriteLine(Titulo.ToUpper()); System.Console.WriteLine(mensaje); } } class ProcesosDeUsuario Composicin { private Impresion imp; public void ImprimirInstrucciones() { imp = new Impresion(); imp.Imprimir("Bienvenido", "Presione Enter para continuar"); System.Console.ReadLine(); } } 55

Composicin vs. Herencia


a) HERENCIA
class A { public int var1; public int var2; public int var3; } class B : A { public int var4; public int var5; } class Programa { static void Main() { B objetoB = new B(); objetoB. } }

Mapa de memoria para objetoB


objetoB . var1 var2 var3 var4 var5

56

Ing. Ramn Roque Hernndez, M.C.

28

Programacin Orientada a Objetos con C#

Composicin vs. Herencia


b) COMPOSICION
class A { public int var1; public int var2; public int var3; } class B { public A objetoA = new A(); public int var4; public int var5; } class Programa { static void Main() { B objetoB = new B(); objetoB. } }

Mapa de memoria para objetoB


objetoB . objetoA . var1 var2 var3 var4 var5

57

Composicin vs. Herencia


Usar Herencia Cuando Se desee incorporar en la clase las variables, propiedades y mtodos de otra clase. Se desee especializar una clase (agregando caractersticas especficas). Se desee ocultar, o encapsular un objeto bajo una nueva interfaz. Un objeto contenga otro objeto.

(Es un)

Composicin

(Tiene un o unos)

58

Ing. Ramn Roque Hernndez, M.C.

29

Programacin Orientada a Objetos con C#

Evitando la herencia: Clases sealed


Las clases sealed (selladas) pueden ser instanciadas pero NO heredadas. Se utiliza la palabra sealed para indicarlo. Usar sealed simultneamente con abstract produce un error.
class Persona { private string _nombre; public string Nombre { get { return _nombre; } set { _nombre = value; } } } sealed class Empleado : Persona { private string _departamento; public string Departamento { get { return _departamento; } set { _departamento = value; } } } class EmpleadoTiempoParcial:Empleado { private int _horasAsignadas; public int HorasAsignadas { get { return _horasAsignadas; } set { _horasAsignadas = value; } } 59 }

ERROR!

Polimorfismo

60

Ing. Ramn Roque Hernndez, M.C.

30

Programacin Orientada a Objetos con C#

Polimorfismo
Es la habilidad que poseen los objetos para reaccionar de modo diferente ante los mismos mensajes. En C# el polimorfismo est intimamente relacionado con la sobrecarga y mtodos virtuales.

61

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
62

Ing. Ramn Roque Hernndez, M.C.

31

Programacin Orientada a Objetos con C#

Ejemplo virtualoverride
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() { Carro miCarro = new Carro(); miCarro.Arrancar(); System.Console.ReadLine(); } } Ejecucin del programa Arrancar....Clase Carro 63

Ejemplo virtual virtualoverride (Polimorfismo en Tiempo de ejecuci ejecucin)


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() { Vehiculo v; v = new Vehiculo(); v.Arrancar(); v = new Carro(); v.Arrancar(); System.Console.ReadLine(); } } En una variable tipo Vehiculo se almacenan objetos tipo Vehiculo y tipo Carro. Al invocar el mismo mtodo para el mismo objeto, se observa una conducta diferente, apropiada para cada objeto.

Ejecucin del programa Arrancar...Clase Vehiculo Arrancar....Clase Carro

64

Ing. Ramn Roque Hernndez, M.C.

32

Programacin Orientada a Objetos con C#

override sealed
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 "); } } ERROR!!!...El mtodo ya class TVColor : TV no se puede sobreescribir. { public override void Prender() { System.Console.WriteLine(" La tele a color se esta prendiendo"); } } 65

Ocultar mtodos 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 "); } }
66

Ing. Ramn Roque Hernndez, M.C.

33

Programacin Orientada a Objetos con C#

Clases abstractas

67

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.

68

Ing. Ramn Roque Hernndez, M.C.

34

Programacin Orientada a Objetos con C#

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; } class Empleado : Persona } { public string ObtenerNombreCompleto() private int claveEmpleado; { public int Clave return { this.Nombre + " " + this.Apellido; get { return claveEmpleado; } } set { claveEmpleado = value; } } } } class Cliente : Persona { private string rfc; public string RFC { get { return rfc; } set { rfc = value; } 69 } }

Ejemplo: Clase Abstracta

Continuacin Ejemplo de Clase Abstracta


class Programa { static void Main() { Empleado unEmpleado = new Empleado(); unEmpleado.Nombre = "Juan"; unEmpleado.Apellido = "Gonzalez"; unEmpleado.Clave = 1; System.Console.WriteLine(unEmpleado.ObtenerNombreCompleto()); Cliente unCliente = new Cliente(); unCliente.Nombre = "Pedro"; unCliente.Apellido = "Ramirez"; unCliente.RFC = "RAHP780212"; System.Console.WriteLine(unCliente.ObtenerNombreCompleto()); System.Console.ReadLine(); } } 70

Ing. Ramn Roque Hernndez, M.C.

35

Programacin Orientada a Objetos con C#

Clases Abstractas con elementos 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 abstractos NO proporcionan implementacin; solo declaraciones. En la subclase, se utiliza override para realizar la implementacin correspondiente.
71

Ejemplo: Clase Abstracta con 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 { get; set; } public abstract string ConsultarTodosLosDatos(); public string ObtenerNombreCompleto() { return this.Nombre + " " + this.Apellido; } }

Se DEBEN implementar estos elementos al heredar de esta clase.

72

Ing. Ramn Roque Hernndez, M.C.

36

Programacin Orientada a Objetos con C#

Continuaci Continuacin Clase Abstracta con elementos abstractos


class Empleado : Persona { Implementacin 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 { Implementacin 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; } }

73

Continuacin Clase Abstracta con elementos abstractos


class Programa { static void Main() { Empleado unEmpleado = new Empleado(); unEmpleado.Nombre = "Juan"; unEmpleado.Apellido = "Gonzalez"; unEmpleado.Clave = 1; System.Console.WriteLine( unEmpleado.ConsultarTodosLosDatos() ); System.Console.WriteLine( unEmpleado.ObtenerNombreCompleto() ); Cliente unCliente = new Cliente(); unCliente.Nombre = "Pedro"; unCliente.Apellido = "Ramirez"; unCliente.Clave = 34; System.Console.WriteLine( unCliente.ConsultarTodosLosDatos() ); System.Console.WriteLine( unCliente.ObtenerNombreCompleto()); System.Console.ReadLine(); } }

74

Ing. Ramn Roque Hernndez, M.C.

37

También podría gustarte