poo conc sharp

37
Programación Orientada a Objetos con C# Ing. Ramón Roque Hernández, M.C. 1 1 Programaci Programación Orientada Orientada a a Objetos Objetos en C# en C# Ing. Ramón Roque Hernández, M.C. [email protected] 2 mo mo declarar declarar una una clase clase class nombre_de_la_clase { … contenido de la clase }

Upload: daltamiranoa7

Post on 24-Oct-2015

54 views

Category:

Documents


28 download

TRANSCRIPT

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 1

1

ProgramaciProgramacióónn OrientadaOrientada

a a ObjetosObjetos en C#en C#

Ing. Ramón Roque Hernández, M.C.

[email protected]

2

CCóómomo declarardeclarar unauna claseclase

class nombre_de_la_clase

{

… contenido de la clase

}

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 2

3

DentroDentro de la de la claseclase……

• Se pueden declarar variables, propiedades, métodos, etc.

• Cada elemento puede tener un modificador de acceso.

• Un Modificador de acceso especifica quienes estánautorizados a “ver” ese elemento.

• Si no se especifica ningún modificador de acceso, se asume que se trata de un elemento “private”.

4

ModificadoresModificadores de de accesoacceso

• publicAccesible a todos los elementos

• privateAccesible solo a esa misma clase

• protectedAccesible solo a la misma clase y métodos de sus clasesderivadas. No accesible desde el exterior.

• internalAccesible solo a ese ensamblado

• protected internalAccesible desde el mismo ensamblado, la misma clase y métodos de sus clases derivadas

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 3

5

ModificadoresModificadores de de accesoacceso

SISISISISIpublic

NOSISISISIprotected internal

NONOSISISIprotected

NOSINOSISIinternal

NONONONOSIprivate

Externamente

(Distinto

Assembly)

Externamente

(Mismo

Assembly)

Subclase

(Distinto

Assembly)

Subclase

(Mismoassembly)

Clase dondese declaró

Modificador de acceso

Accesible desde …

6

EjemploEjemplo: Variables con : Variables con

ModificadoresModificadores de de accesoacceso

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;

}

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 4

7

CamposCampos

• “Un campo es un dato común a todos los objetos de una determinada clase”.

• Las variables declaradas dentro de una claseson ejemplos de “campos” (fields).

8

CrearCrear objetosobjetos::

InstanciaciInstanciacióónn

• Una vez creada la clase, ya es posible “consumirla”mediante la instanciación.

• La instanciación es el proceso de crear objetos a partir de una clase.

• Ejemplo en dos pasos:claseA miobjetoA;

miobjetoA = new claseA();

• Ejemplo en un paso:

claseA miobjetoA = new claseA();

1. Definir el tipo de

“miObjetoA”

2. Adquirir memoria sin

inicializar para el nuevo

objeto usando new.

3. Ejecutar el constructor

para inicializar la memoria

y convertirla en un objeto

usable

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 5

9

Variables: Variables: PorPor valorvalor

• Las variables de los tipos de datos básicos (primitivos) se crean en el STACK. Se dice que son manejados por valor.

No definido

int num1;

STACK

num150

num1 = 50;

STACK

num1

10

ObjetosObjetos: : PorPor referenciareferencia

• Los objetos se crean en el HEAP. En el STACK solo se guarda una referencia a la dirección del HEAP donde se encuentran. Se dice que son manejados por referencia.

No definido

����

Cliente cli;

STACK

cliobjeto cli

HEAP

[ Referenciacli ]

����

cli = new Cliente();

STACK

cli

?

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 6

11

ObjetosObjetos: : PorPor referenciareferencia

objeto cli2

objeto cli

HEAP

[ Referenciacli2 ]

����

[ Referenciacli ]

����

Cliente cli2 = new Cliente();

STACK

cli

cli2

objeto cli2

objeto cli

HEAP

[ Referenciacli2 ]

����

[ Referenciacli ]

����

cli2 = cli;

STACK

cli

cli2

cli2 = cli solo copia las

referencias, no copia los

objetos.

El objeto cli2 queda sin

referencias hacia él .

12

AccediendoAccediendo a los a los miembrosmiembros

de los de los objetosobjetos

Asignación:

miobjetoA . Numero2 = 50;

Lectura:

miOtraVariable = miobjetoA . Numero2;

Nombre

del objetoSelección Miembro

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 7

13

MMéétodostodos

14

MMéétodostodos

• Contienen instrucciones para ejecutar al momento de

ser invocados.

• Un método contiene:

– Modificador de Acceso (Determina su visibilidad)

– Tipo de dato (Devuelto al finalizar su ejecución)

– Identificador (Nombre con el cual se invoca)

– Parámetros (Cero o mas variables que recibe el método)

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 8

15

EjemploEjemplo de de mméétodotodo

class Carro

{

public void Encender()

{

System.Console.WriteLine("El Auto se ha

encendido!");

}

}

Modificador

de accesoTipo de dato

del valor regresadoIdentificador

Parámetros

16

InvocandoInvocando al al mméétodotodo

Carro miCarro = new Carro();

miCarro.Encender();

Nombre del

objeto

Nombre del

método Parámetros

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 9

1717

MMéétodostodos queque retornanretornan valoresvalores

• El “Tipo de dato” del método NO es “void”.

• Dentro del método debe haber una sentencia “return” con algún

valor del tipo de dato del método.

• Ejemplo (Al declararlo):

public string ConsultarEstado()

{

return estado;

}

• Al llamar al método (desde el programa):

string estado_actual = miCarro.ConsultarEstado();

1818

MMéétodostodos queque recibenreciben

parparáámetrosmetros

• Entre los paréntesis se especifican una o mas variables (separadas por comas) con sus respectivos tipos de datos.

• Esas variables estarán accesibles dentro del método.

public void CambiarEstado( string nuevoestado )

{

estado = nuevoestado;

}

• Al momento de invocar el método, se deben incluir esos valoresen la llamada:

miCarro.CambiarEstado(“Apagado”);

Dato

de

entrada

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 10

19

thisthis

Para hacer referencia (explícita) 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.

20

EjemplosEjemplos de de mméétodostodos

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;

}

}

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 11

2121

EjemplosEjemplos de de llamadasllamadas a los a los

mméétodostodos

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();

}

}

…Continuación del ejemplo anterior (Clase Carro)…

22

SobrecargaSobrecarga

• Se refiere a la posibilidad de crear métodos queposean el mismo nombre y difieran en la cantidad y/otipo de parámetros (Firma).

– No es posible crear 2 funciones con el mismo identificadorque solo difieran en el tipo de dato devuelto.

static bool impresion(int num)

static char impresion(int num)

– No es posible que 2 métodos sobrecargados solo difieran en el modificador “static”.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 12

2323

EjemploEjemplo de de sobrecargasobrecarga

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();

}

}

24

MMéétodotodo ConstructorConstructor

• Método especial que es invocado automáticamente

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

vacío por default.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 13

25

EjemploEjemplo de constructorde constructor

class Persona

{

public string Nombre;

public Persona()

{

Nombre = "Desconocido";

}

}

Constructor.

(notar que tiene

el mismo nombre

de la clase)

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();

}

}

26

EjemploEjemplo de constructor de constructor queque

reciberecibe parparáámetrosmetros

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 parámetros

al momento de la creación del objeto.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 14

27

EjemploEjemplo::

SobrecargaSobrecarga de Constructorde Constructor

class Persona

{ public string Nombre;

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();

}

}

Constructores

Dos constructores

= Dos diferentes

formas de

crear objetos

28

MMéétodotodo DestructorDestructor

• No puede llamarse explícitamente.

• Se invoca automáticamente cuando el objeto esdestruido.

• 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 método constructor, peroanteponiendo una tilde (~) al nombre.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 15

29

EjemploEjemplo de destructorde 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.

30

DestrucciDestruccióónn de de objetosobjetos

• C# gestiona la memoria de modo automáticomediante el “recolector de basura” (Garbage Collector o GC), quien se encarga de eliminar la memoria que en algún 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 posiblecontrolar exactamente el momento en el cual la memoria vuelve a estar disponible.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 16

31

DestrucciDestruccióónn de de objetosobjetos

• Se puede indicar en el programa cuando un objeto

deja de ser util, asignándole 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.

32

El Garbage Collector El Garbage Collector

((recolectorrecolector de de basurabasura))

• 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 aplicación está finalizando

– El programador lo invoca manualmente (NO recomendado):

System.GC.Collect()

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 17

33

PropiedadesPropiedades

34

PropiedadesPropiedades

• Son valores (variables) que poseen los objetos.

• Se pueden implementar:

– Declarando la variable como public• No sería posible especificarla como Solo-Lectura o Solo-Escritura

• No se puede implementar código adicional asociado a la Lectura o Escritura de la variable.

– Declarando un método de acceso a la variable• Empobrece la legibilidad del código. Puede crear confusión.

– Utilizando accesadores get{ } y set { }para las propiedades• Recomendado en C#

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 18

35

ImplementadoImplementado propiedadespropiedades con con mméétodostodos

de de accesoacceso

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());

}

}

• Es la única opción en algunos lenguajes de programación orientados a objetos.

• En C#.NET existe otra manera mas recomendable.

36

ImplementandoImplementando propiedadespropiedades

con con accesadoresaccesadores get, setget, set

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);

}

}

(Manera recomendada)

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 19

37

PropiedadesPropiedades de solo de solo lecturalectura

• 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

asignación

provocaría

un error

38

NivelNivel de de accesoacceso asimasiméétricotrico en en

laslas propiedadespropiedades

• Si una propiedad posee “get” y

“set”, entonces uno de los dos

puede tener un modificador de

acceso explícito.

• El nivel de acceso explícito 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 implementación de ellas.

class Empleado

{

private int _numero;

public int Numero

{ get

{

return _numero;

}

private set

{

_numero = value;

}

}

}

“get” sigue siendo public

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 20

39

HerenciaHerencia y y ComposiciComposicióónn

40

HerenciaHerencia

• Característica de la POO que permitedefinir nuevas clases a partir de otrasya existentes.

• Puede usarse para:– Relaciones del tipo “es un”

• Ejemplo: Un Gerente “es un” Empleado con características propias adicionales.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 21

41

UsoUso de la de la HerenciaHerencia

• Beneficios:

– Permte escribir menos código.

– Mejora la reusabilidad de los componentes.

– Facilita el mantenimiento del sistema completo.

• Util para un buen diseño del programa.

• Un diseño pobre sin herencia implementaría las

clases involucradas de manera independiente.

42

HerenciaHerencia en C#en C#

• En C# solo se permite Herencia simple.

• Ejemplo de Herencia en C#

class A

{

}

class B : A

{

}

• Todos los objetos heredan de System.Object

Indica que B “Hereda de” A

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 22

4343

EjemploEjemplo de de HerenciaHerencia

• Se deben modelar dos clases con las siguientescaracterísticas:

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

4444

Mal Mal DiseDiseññoo

(No (No recomendablerecomendable))

• Modelarlas de manera independiente.

class Automovil

{

private int cf, cp;

public int CaballosDeFuerza

{

get { return cf; }

set { cf = value; }

}

public int CantidadDePuertas

{

get { return cp; }

set { cp = value; }

}

public void Arrancar()

{

}

public void Detener()

{

}

public void Acelerar(int cuanto)

{

}

}

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)

{

}

}

Iguales

Iguales

Iguales

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 23

4545

DiseDiseññoo usandousando HerenciaHerencia

((RecomendadoRecomendado))

Vehiculo

CaballosDeFuerza : int

Arrancar() : void

Detener() : void

Automovil

CantidadDePuertas : int

Acelerar(int cuanto) : void

PalaMecanica

PesoMaximoDeLevante : int

MoverPala(string direccion) : void

Superclase

(Clase base)

Subclases

(Clases Hijas)

Herencia

4646

DiseDiseññoo de de laslas clasesclases usandousando

herenciaherencia en C#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)

{

}

}

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 24

4747

NotasNotas sobresobre el el ejemploejemplo……

• Todas las variables, métodos y propiedades que no sean privadas, serán

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();

}

}

48

LlamandoLlamando mméétodostodos de la de la

claseclase basebase

• Una subclase puede llamar los métodos 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();

}

}

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 25

49

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();

}

}

SecuenciaSecuencia de de ejecuciejecucióónn de de

constructoresconstructores en la en la HerenciaHerencia

Considerar el siguiente ejemplo… ¿Qué salida se obtiene?

50

SecuenciaSecuencia de de ejecuciejecucióónn de de

constructoresconstructores en la en la HerenciaHerencia

Constructor de la clase A

Constructor de la clase B

Constructor de la clase C

Salida del programa…

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”, después el constructor de la clase

“B”, y finalmente el constructor de la

clase “C”

System.Object

A

B

C

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 26

51

InvocandoInvocando constructoresconstructores de de

la la claseclase basebaseclass 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();

}

}

X=1 Y=2 R =1

La salida del

programa es…

La palabra reservada

base( ) hace referencia a

la clase padre inmediata

desde la cual se invoca.

Entre paréntesis se

especifican

los parámetros requeridos.

52

SecuenciaSecuencia de de ejecuciejecucióónn de los de los

destructoresdestructores usandousando herenciaherencia

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();

}

}

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 27

53

SecuenciaSecuencia de de ejecuciejecucióónn de los de los

destructoresdestructores usandousando herenciaherencia

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

La salida del programa es…

Los destructores son

invocados en orden inverso a

los constructores.

54

ComposiciComposicióónn

• Un objeto puede tener como miembro otro objetodefinido previamente.

• Cuando un objeto se encuentra compuesto por otros

objetos, se dice que hay “Composición”.

• La composición permite implementar relaciones del

tipo “tiene un”.

– Ejemplo: Un Auto “tiene un” Motor.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 28

55

ComposiciComposicióónn

ProcesosDeUsuario Impresion

class Impresion

{

public void Imprimir(string Titulo, string mensaje)

{

System.Console.WriteLine(Titulo.ToUpper());

System.Console.WriteLine(mensaje);

}

}

class ProcesosDeUsuario

{

private Impresion imp;

public void ImprimirInstrucciones()

{

imp = new Impresion();

imp.Imprimir("Bienvenido", "Presione Enter para continuar");

System.Console.ReadLine();

}

}

Composición

56

ComposiciComposicióónn vs. vs. HerenciaHerencia

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

var5

var4

var3

var2

var1objetoB .

a) HERENCIA

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 29

57

ComposiciComposicióónn vs. vs. HerenciaHerencia

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

var5

var4

objetoA .

var3

var2

var1objetoB .

b) COMPOSICION

5858

ComposiciComposicióónn vs. vs. HerenciaHerencia

Usar… Cuando…

Herencia

(Es un…)

• Se desee incorporar en la clase las variables, propiedades y métodos de otra clase.

• Se desee especializar una clase (agregandocaracterísticas específicas).

Composición

(Tiene un o unos…)

• Se desee ocultar, o encapsular un objeto bajouna nueva interfaz.

• Un objeto contenga otro objeto.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 30

59

EvitandoEvitando la la herenciaherencia::

ClasesClases sealedsealed

• Las clases sealed (selladas) puedenser instanciadaspero NO heredadas.

• Se utiliza la palabra“sealed” paraindicarlo.

• Usar “sealed”simultáneamentecon “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; }

}

}

ERROR!

60

PolimorfismoPolimorfismo

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 31

61

PolimorfismoPolimorfismo

• Es la habilidad que poseen los objetos para

reaccionar de modo diferente ante los mismosmensajes.

• En C# el polimorfismo está intimamente relacionado

con la sobrecarga y métodos virtuales.

62

MMéétodostodos VirtualesVirtuales

• Son métodos en la clase base pensados para ser sobre-escritospor subclases.

• Para declararlos, se utiliza la palabra reservada “virtual”; parasobreescribirlos, en la subclase se utiliza la palabra reservada“override”.

• Un método virtual “PUEDE” ser sobreescrito, o utilizarse talcomo está.

• Solo se puede utilizar “override” si el método en la clase base está marcado como “virtual”, “abstract” u “override”.

• El método “override” debe mantener el mismo nivel de accesoque el método “Virtual” correspondiente

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 32

63

EjemploEjemplo

virtualvirtual……overrideoverride

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();

}

}

Ejecución del programa…Arrancar....Clase Carro

64

EjemploEjemplo virtualvirtual……overrideoverride

((PolimorfismoPolimorfismo en en TiempoTiempo de de ejecuciejecucióónn))

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();

}

}

Ejecución del programa…

Arrancar...Clase Vehiculo

Arrancar....Clase Carro

En una variabletipo “Vehiculo”se almacenanobjetos tipo

“Vehiculo” y tipo“Carro”. Al invocar el mismo métodopara el mismoobjeto, se observauna conductadiferente,

apropiada paracada objeto.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 33

65

override sealedoverride sealed

• Agregar “sealed” a un método “override” impide la futura sobre-escritura de ese método, proporcionando una implementación 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()

{ System.Console.WriteLine(" La tele a color se esta prendiendo");

}

}

ERROR!!!...El método ya

no se puede sobreescribir.

66

OcultarOcultar mméétodostodos heredadosheredados

• Es posible ocultar un método heredado e introducir uno nuevo a la jerarquía de clases. El método 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 ");

}

}

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 34

67

ClasesClases abstractasabstractas

68

ClasesClases AbstractasAbstractas

• 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.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 35

69

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 string ObtenerNombreCompleto()

{

return

this.Nombre + " " + this.Apellido;

}

}

EjemploEjemplo: :

ClaseClase

AbstractaAbstracta

class Empleado : Persona

{

private int claveEmpleado;

public int Clave

{

get { return claveEmpleado; }

set { claveEmpleado = value; }

}

}

class Cliente : Persona

{

private string rfc;

public string RFC

{

get { return rfc; }

set { rfc = value; }

}

}

70

ContinuaciContinuacióónn……

EjemploEjemplo de de ClaseClase AbstractaAbstracta

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();

}

}

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 36

71

ClasesClases AbstractasAbstractas con con

elementoselementos abstractosabstractos

• Las clases abstractas pueden definir métodos y propiedades

abstractos, con lo que su respectiva implementación 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 implementación;

solo declaraciones.

- En la subclase, se utiliza “override” para realizar la

implementación correspondiente.

72

EjemploEjemplo: : ClaseClase AbstractaAbstracta con con

elementoselementos abstractosabstractosabstract 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.

Programación Orientada a Objetos con C#

Ing. Ramón Roque Hernández, M.C. 37

73

ContinuaciContinuacióónn……

ClaseClase AbstractaAbstracta con con elementoselementos

abstractosabstractosclass 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;

}

}

Implementación

Implementación

74

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();

}

}

ContinuaciContinuacióónn……

ClaseClase AbstractaAbstracta con con

elementoselementos abstractosabstractos