poo conc sharp
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.
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