Anda di halaman 1dari 28

Programacin orientada a objetos con

C# (II)

ndice de contenidos

Introduccin

Composicin
Herencia
Polimorfismo
Interfaces
Clases abstractas
Delegados
Conversin de tipos
Definicin de sistemas orientados a objetos

Reutilizacin y relaciones entre clases


Tradicionalmente el cdigo se reutilizaba por el sistema de
cortar aqu y pegar all
z

Manual

Difcil mantenimiento posterior

Nunca se cierra nada del cdigo

Los objetos abren nuevas posibilidades


z

Encapsulacin de datos y mtodos de uso

Composicin

Extensin: herencia, polimorfismo e interfaces

Tipos abstractos de datos e interfaces


Se intenta distinguir entre:
z
z
z
z

Lo que hay que hacer: interface


Cmo se hace: clase
La interfaz sirve de especificacin (contrato) entre las partes
La clase es el producto que satisface aquella especificacin

Tipos abstractos de datos:


z

z
z

Si las variables que representan el estado de un objeto son


privadas, se puede modificar su representacin sin que afecte a los
usuarios de la clase
Los mtodos proporcionan toda la interfaz
Se dice que la clase es un tipo abstracto de datos (TAD) porque no
se sabe la forma concreta de representar los datos

ndice de contenidos
Introduccin

Composicin

Herencia
Polimorfismo
Interfaces
Clases abstractas
Delegados
Conversin de tipos
Definicin de sistemas orientados a objetos

Composicin
Un objeto incorpora otro(s) objeto(s) como parte integral
class B {
A varA;
...
}

Se dice que los objetos de tipo B tienen un objeto de tipo A


Tpicamente los objetos internos (A) son private y se
inicializan va constructor (el de B)
Se usa composicin cuando se necesita la funcionalidad de
otra clase dentro pero no su interfaz (por eso son private)

Composicin
Asociaciones:
z
z
z
z

0..1
1
0 .. *
1 .. *

cero a uno
uno
cero a muchos
uno a muchos

Punto

Cuadrado

Cubo

Extensin
class B : A
{}
Se usa cuando A es interesante pero necesitamos ms
funcionalidad
Se dice que la clase B es una clase A enriquecida
Se dice que B deriva de A. A es la clase base
Una clase derivada hereda la mayor parte de los elementos de
su clase base
Una clase derivada no puede ser ms accesible que su clase
base

10

Relacin de extensin
Animal

Perro

Gato

11

ndice de contenidos
Introduccin
Composicin

Herencia

Polimorfismo
Interfaces
Clases abstractas
Delegados
Conversin de tipos
Definicin de sistemas orientados a objetos

13

Herencia
La forma ms bsica de extensin de clases
class B : A { ... }
B hereda de A
z
z

Los componentes (atributos y mtodos)


Y la interfaz (mtodos pblicos)

B puede redefinir mtodos de A


z
z

Se dice que los mtodos de A redefinidos quedan ocultos


Se puede acceder a los mtodos ocultos
base.metodoOculto ()

14

Ejemplo
Supongamos que tenemos una clase que define una Persona
Y la queremos utilizar en la clsica aplicacin de gestin de
una universidad

Persona
int dni
String nombre
String direccion
int telefono
void mostrarPorPantalla()
int obtenerDni()
void modificarDni(int dni)

15

Ejemplo
Llegar el momento en el que necesitaremos una clase
Alumno y otra Profesor
Ambas tienen cosas comunes
Ambas son Personas y seria perfecto no tener que volver a
escribir (y pensar) todas las variables y funciones que ya hay
en la clase Persona

16

Ejemplo
Persona
int dni
String nombre
String direccion
int telefono
void mostrarPorPantalla()
int obtenerDni()
void modificarDni(int dni)

Alumno

Profesor

int[] notas

Asignatura[] asigs

void nuevaNota(int nota)


void listadoNotas()
void mostrarPorPantalla()

void mostrarPorPantalla()

17

Ejemplo
using System;
public class
{
protected
protected
protected
protected

Persona
int dni;
String nombre;
String direccion;
int telefono;

public int obtenerDni() {


return dni;
}
public void modificarDni(int dni) {
this.dni=dni;
}

Redefinible

public virtual void mostrarPorPantalla() {


Console.WriteLine("DNI: "+dni);
Console.WriteLine("Nombre: "+nombre);
Console.WriteLine("Direccion: "+direccion);
Console.WriteLine("Telefono: "+telefono);
}
}

18

Ejemplo
using System;
public class Alumno : Persona
{
protected int[] notas;
public Alumno() {
notas=new int[10];
}
public void nuevaNota(int nota) {
// Aade una nueva nota
}
public void listadoNotas() {
Console.WriteLine("Notas:");
for(int i=0;i<notas.Length;i++) {
Console.WriteLine(notas[i]);
}
}

Redefinido

public override void mostrarPorPantalla() {


base.mostrarPorPantalla();
listadoNotas();
}
}
19

Herencia en C#
Se especifica qu mtodos se van a redefinir en la clase hija y
cules no
Esto permite generar cdigo ms eficiente
Los mtodos que queramos redefinir deben llevar el modificador
virtual
En los mtodos de la clase hija debemos usar el modificador
override si estamos redefiniendo un mtodo de alguna clase
base
Slo herencia simple: una clase slo puede heredar de otra
Si una clase no hereda de alguna otra clase, C# provoca que
automticamente herede de la clase Object

20

Extensin de clases base


Sintaxis para derivar una clase desde una clase base
class
class Token
Token
{{
Clase
Clase
Clasederivada
derivada
Clasebase
base
...
...
}}
class
class ComentToken:
ComentToken: Token
Token
{{
...
...
22puntos
puntos
}}

Token
Token

ComentToken
ComentToken

Una clase derivada hereda la mayor parte de los elementos de


su clase base
Una clase derivada no puede ser ms accesible que su clase
base
21

Acceso a miembros de la clase base


Los miembros heredados con proteccin estn implcitamente
protegidos en la clase derivada
Los miembros de una clase derivada slo pueden acceder a sus
miembros heredados con proteccin
class
class Token
Token
{{ ...
...
protected
protected string
string name;
name;
}}
class
class ComentToken:
ComentToken: Token
Token
{{ ...
...
public
public string
string Name(
Name( ))
{{
return
return name;
name;
}}
}}

class
class Outside
Outside
{{
void
void Fails(Token
Fails(Token t)
t)
{{
...
...
t.name
t.name
...
...
}}
}}

22

Llamadas a constructores de la clase base


Las declaraciones de constructores deben usar la palabra base
Una clase derivada no puede acceder a un constructor privado de
la clase base
Se usa la palabra base para habilitar el mbito del identificador
class
class Token
Token
{{
protected
protected Token(string
Token(string name)
name) {{ ...
... }}
...
...
}}
class
class ComentToken:
ComentToken: Token
Token
{{
public
public ComentToken(string
ComentToken(string name)
name) :: base(name)
base(name) {{ }}
...
...
}}
23

10

Definicin de mtodos virtuales


Sintaxis: Se declara como virtual
class
class Token
Token
{{
...
...
public
public int
int LineNumber(
LineNumber( ))
{{ ...
...
}}
public
public virtual
virtual string
string Name(
Name( ))
{{ ...
...
}}
}}

Para usar mtodos virtuales:


z
z

No se puede declarar mtodos virtuales como estticos


No se puede declarar mtodos virtuales como privados
24

Sustitucin de mtodos (override)


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

25

11

Uso de mtodos override


Un mtodo override debe coincidir con su mtodo virtual
asociado
class
class Token
Token
{{ ...
...
public
public int
int LineNumber(
LineNumber( )) {{ ...
... }}
public
public virtual
virtual string
string Name(
Name( )) {{ ...
... }}
}}
class
class ComentToken:
ComentToken: Token
Token
{{ ...
...
public
public override
override int
int LineNumber(
LineNumber( )) {{ ...
... }}
public
public override
override string
string Name(
Name( )) {{ ...
... }}
}}

8
9

Se puede sustituir un mtodo override


No se puede declarar explcitamente un override como
virtual
No se puede declarar un mtodo override como static o
private
26

Uso de new para ocultar mtodos


Sintaxis: Para ocultar un mtodo se usa la palabra reservada
new
class
class Token
Token
{{ ...
...
public
public int
int LineNumber(
LineNumber( )) {{ ...
... }}
}}
class
class ComentToken:
ComentToken: Token
Token
{{ ...
...
new
new public
public int
int LineNumber(
LineNumber( )) {{ ...
... }}
}}

27

12

Uso de la palabra reservada new


Ocultar tanto mtodos virtuales como no virtuales
class
class Token
Token
{{ ...
...
public
public int
int LineNumber(
LineNumber( )) {{ ...
... }}
public
public virtual
virtual string
string Name(
Name( )) {{ ...
... }}
}}
class
class ComentToken:
ComentToken: Token
Token
{{ ...
...
new
new public
public int
int LineNumber(
LineNumber( )) {{ ...
... }}
public
public override
override string
string Name(
Name( )) {{ ...
... }}
}}

Resolver conflictos de nombre en el cdigo


Ocultar mtodos que tengan signaturas idnticas
28

Uso de clases selladas


Ninguna clase puede derivar de una clase sellada
Las clases selladas sirven para optimizar operaciones en
tiempo de ejecucin
Muchas clases de .NET Framework son selladas: String,
StringBuilder, etc.
Sintaxis: Se usa la palabra reservada sealed
namespace
namespace System
System
{{
public
public sealed
sealed class
class String
String
{{
...
...
}}
}}
namespace
namespace Mine
Mine
{{
class
class FancyString:
FancyString: String
String {{ ...
... }}
}}

8
29

13

ndice de contenidos
Introduccin
Composicin
Herencia

Polimorfismo

Interfaces
Clases abstractas
Delegados
Conversin de tipos
Definicin de sistemas orientados a objetos

31

Ejemplo
Persona
int dni
String nombre
String direccion
int telefono
void mostrarPorPantalla()
int obtenerDni()
void modificarDni(int dni)

Alumno

Profesor

int[] notas

Asignatura[] asigs

void nuevaNota(int nota)


void listadoNotas()
void mostrarPorPantalla()

void mostrarPorPantalla()

32

14

Ejemplo
public class Persona
{ ...
public virtual void mostrarPorPantalla() {
Console.WriteLine("DNI: "+dni);
Console.WriteLine("Nombre: "+nombre);
Console.WriteLine("Direccion: "+direccion);
Console.WriteLine("Telefono: "+telefono);
}
}
public class Alumno : Persona
{
protected int[] notas;
...
public void listadoNotas() {
...
}
public override void mostrarPorPantalla() {
base.mostrarPorPantalla();
listadoNotas();
}
}
33

Ejemplo
En cualquier lugar donde necesitemos una variable de tipo
Persona, podemos usar una de tipo Alumno o Profesor
z
z

Ejemplo: en un vector de Personas podremos almacenar tanto


Personas, como Alumnos y Profesores
Con el operador is podemos comprobar el tipo de un objeto:
if (o is Alumno) {
// es un alumno
}

Al llamar a un mtodo se ejecutar la versin correcta


dependiendo de la clase concreta
En nuestro ejemplo cuando llamemos a
mostrarPorPantalla() para una Persona se mostrarn sus
datos personales, si el objeto es de tipo Alumno adems se
mostraran sus notas
34

15

Ejemplo
Persona [] lista;
lista = new Persona[10];
...
for (int i=0; i<lista.GetLength(0); i++)
{
if (lista[i] is Alumno)
{
Console.WriteLine(lista[i].nombre + es un alumno);
}
else if (lista[i] is Profesor)
{
Console.WriteLine(lista[i].nombre + es un professor);
}
lista[i].mostrarPorPantalla();
}

35

ndice de contenidos

Introduccin
Composicin
Herencia
Polimorfismo

Interfaces

Clases abstractas
Delegados
Conversin de tipos
Definicin de sistemas orientados a objetos

37

16

Interfaces
Muchas veces al heredar de un objeto lo nico que queremos
es que herede un comportamiento
Es decir, asegurarnos que implemente unos mtodos
concretos para aplicar el polimorfismo
Tambin hay situaciones en las que nos gustara heredar de
varias clases: pero C# no lo permite
Una interfaz es la definicin de un conjunto de mtodos para
los que no se da implementacin pero que las clases hijas
deben implementar
Una consecuencia de no tener implementacin es que los
interfaces no se pueden instanciar
38

Ejemplo
Editor de formas geomtricas
IFigura

void dibujar()
float area()
float perimetro()

Cuadrado

Rectangulo

Circulo

39

17

Ejemplo
public interface IFigura {
void dibujar();
float area();
float perimetro();
}

public class Cuadrado : IFigura {


protected float lado;
public Cuadrado(float lado) {
this.lado=lado;
}
public float area() {
return lado*lado;
}
public float perimetro() {
return 4*lado;
}
public void dibujar() {
System.Console.WriteLine("[]");
}
}
40

Ejemplo
public interface IFigura {
void dibujar();
float area();
float perimetro();
}

public class Circulo : IFigura {


protected float radio;
protected const float PI=3.14159F;
public Circulo(float radio) {
this.radio=radio;
}
public float area() {
return PI*(float)Math.Pow(radio,2);
}
public float perimetro() {
return 2*PI*radio;
}
public void dibujar() {
Console.WriteLine("O");
}
}

41

18

Ejemplo
Circulo c1=new Circulo(1);
Cuadrado c2=new Cuadrado(2);
IFigura f;
f=c1;
f.dibujar();
Console.WriteLine("PERIMETRO="+f.perimetro());
Console.WriteLine(AREA="+f.area());
f=c2;
f.dibujar();
Console.WriteLine("PERIMETRO="+f.perimetro());
Console.WriteLine(AREA="+f.area());

42

Declaracin de interfaces

Los
Losnombres
nombresde
deinterfaces
interfaces
empiezan
Imay
mayscula
empiezancon
conImayscula

interface
interface IToken
IToken
{{
int
int LineNumber(
LineNumber( );
);
string
string Name(
Name( );
);
}}
Sin
. de
espec
Sinespec.
espec.
deacceso
acceso

IToken
IToken
interface
interface
LineNumber(
LineNumber( ))
Name(
Name( ))

M
todos sin
Mtodos
sincuerpo
cuerpo

43

19

Implementacin de varias interfaces


Una clase puede implementar cero o ms interfaces
interface
interface IToken
IToken
{{
IToken
IVisitable
IVisitable
IToken
string
string Name(
Name( );
);

interface

interface
interface

interface

}}
interface
interface IVisitable
IVisitable
{{
void
void Accept(IVisitante
Accept(IVisitante v);
v);
}}
Token
class
Token
class Token:
Token: IToken,
IToken, IVisitable
IVisitable
{{ ...
...
concrete

concrete
}}

Una interfaz puede extender cero o ms interfaces


Una clase puede ser ms accesible que sus interfaces base
Una interfaz no puede ser ms accesible que su interfaz base
Una clase implementa todos los mtodos de interfaz heredados
44

Implementacin de mtodos de interfaz


El mtodo que implementa debe ser igual que el mtodo de
interfaz: acceso, retorno, nombre y parmetros
El mtodo que implementa puede ser virtual o no virtual

class
class Token:
Token: IToken,
IToken, IVisitable
IVisitable
{{
public
public virtual
virtual string
string Name(
Name( ))
{{ ...
...
}}
public
public void
void Accept(IVisitante
Accept(IVisitante v)
v)
{{ ...
...
}}
}}

Mismo
Mismo acceso
acceso
Mismo
Mismo retorno
retorno
Mismo
Mismo nombre
nombre
Mismos
metros
par
Mismos par
parmetros

45

20

ndice de contenidos

Introduccin
Composicin
Herencia
Polimorfismo
Interfaces

Clases abstractas
Delegados
Conversin de tipos
Definicin de sistemas orientados a objetos

47

Clases abstractas
Permiten aplazar detalles de implementacin a clases derivadas
Basta indicar la signatura del mtodo sin detallar el cuerpo
z

Se dice que el mtodo es abstracto

Una clase es abstracta si tiene uno o ms mtodos sin detallar


No se pueden crear objetos de clases abstractas

48

21

Declaracin de clases abstractas


Se usa la palabra reservada abstract

abstract
abstract class
class Token
Token
{{
...
...
}}
class
class Test
Test
{{
static
static void
void Main(
Main( ))
{{
new
new Token(
Token( );
);
}}
}}

Token
Token
{{ abstract
abstract }}

No
No se
se pueden
pueden crear
crear instancias
instancias
de
deuna
una clase
claseabstracta
abstracta

49

Uso de clases abstractas


interface
interface IToken
IToken
{{
string
string Name(
Name( );
);
}}
abstract
abstract class
class Token:
Token: IToken
IToken
{{
string
string IToken.Name(
IToken.Name( ))
{{ ...
...
}}
...
...
}}
class
class ComentToken:
ComentToken: Token
Token
{{ ...
...
}}
class
class KeywordToken:
KeywordToken: Token
Token
{{ ...
...
}}

IToken
IToken
interface
interface

Token
Token
{{ abstract
abstract }}

Coment
Coment
Token
Token
concrete
concrete

Keyword
Keyword

Token
Token
concrete
concrete

50

22

Uso de clases abstractas


interface
interface IToken
IToken
{{
string
string Name(
Name( );
);
}}
abstract
abstract class
class Token
Token
{{
public
public virtual
virtual string
string Name(
Name( ))
{{ ...
...
}}
...
...
}}

IToken
IToken
interface
interface

Token
Token
{{ abstract
abstract }}

Coment
Coment
class
class ComentToken:
ComentToken: Token,
Token, IToken
IToken
Token
Token
{{ ...
...

concrete
concrete
}}
class
class KeywordToken:
KeywordToken: Token,
Token, IToken
IToken
{{ ...
...
}}

Keyword
Keyword

Token
Token
concrete
concrete

51

Cases abstractas vs. interfaces


Parecidos
z
z

No se pueden crear instancias de ninguna de ellas


No se puede sellar ninguna de ellas

Diferencias
z
z
z

Las interfaces no pueden contener implementaciones


Las interfaces no pueden declarar miembros no pblicos
Las interfaces no pueden extender nada que no sea una interfaz

52

23

Implementacin de mtodos abstractos


Sintaxis: Se usa la palabra reservada abstract
abstract
abstract class
class Token
Token
{{
public
public virtual
virtual string
string Name(
Name( )) {{ ...
... }}
public
abstract
int
Longitud(
);
public abstract int Longitud( );
}}
class
class ComentToken:
ComentToken: Token
Token
{{
public
public override
override string
string Name(
Name( )) {{ ...
... }}
public
public override
override int
int Longitud(
Longitud( )) {{ ...
... }}
}}

Slo clases abstractas pueden declarar mtodos abstractos


Los mtodos abstractos no pueden tener cuerpo
53

Uso de mtodos abstractos


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

54

24

Interfaces, Clases, Objetos, ...


interface
extiende

implementa
clase

extiende

clase

new

objeto

abstracta
extiende

extiende

extiende
55

ndice de contenidos

Introduccin
Composicin
Herencia
Polimorfismo
Interfaces
Clases abstractas
Delegados
Conversin de tipos

Definicin de sistemas orientados a


objetos
69

25

Herencia
La herencia indica una relacin es un tipo de"
z
z

La herencia es una relacin entre clases


Las nuevas clases aaden especializacin a las existentes

Generalizacin

Msico
Msico

Especializacin

Violinista
Violinista

Clase base

Clase derivada

70

Jerarquas de clases
Las clases con relaciones de herencia forman jerarquas de
clases
Msico
Msico

Msico
Msico de
de
cuerda
cuerda

???
???

toca

Instrumento
Instrumento
musical
musical

toca

Instrumento
Instrumento de
de
cuerda
cuerda

Violinista
Violinista

toca

Violn
Violn

???
???

71

26

Herencia sencilla y mltiple


Herencia sencilla: derivadas de una clase base
Herencia mltiple: derivadas de dos o ms clases base

Instrumento
Instrumento de
de
cuerda
cuerda

Instrumento
Instrumento
musical
musical

Con
Con teclas
teclas

Violn
Violn

Instrumento
Instrumento de
de
cuerda
cuerda

Violn tiene una sola


clase base directa

Instrumento de cuerda tiene dos


clases base directas

72

Polimorfismo
El nombre del mtodo reside en la clase base
Los distintos cuerpos del mtodo residen en las clases derivadas
Msico
Msico de
de cuerda
cuerda
AfinaTuInstrumento(
AfinaTuInstrumento( ))

Guitarrista
Guitarrista

Violinista
Violinista

AfinaTuInstrumento(
AfinaTuInstrumento( ))

AfinaTuInstrumento(
AfinaTuInstrumento( ))

73

27

Clases base abstractas


Algunas clases existen slo para ser clases base
z
z

No tiene sentido crear instancias de estas clases


Estas clases son abstractas

Msico
Msico de
de cuerda
cuerda
{{ abstract
abstract }}

No
No se
se pueden
pueden crear
crear instancias
instancias
de
de clases
clases abstractas
abstractas
Se
Se pueden
pueden crear
crear instancias
instancias
de
de clases
clases concretas
concretas

Guitarrista
Guitarrista
concrete
concrete

Violinista
Violinista
concrete
concrete

74

Interfaces
Las interfaces contienen slo operaciones, no implementacin
Msico
Msico
interface
interface

Msico
Msico de
de cuerda
cuerda
{{ abstract
abstract }}

Violinista
Violinista
concrete
concrete

Nada
Nada ms
ms que
que operaciones.
operaciones.
No
No se
se pueden
pueden crear
crear instancias
instancias
de
de una
una interfaz.
interfaz.

Puede
Puede contener
contener implementacin.
implementacin.
No
No se
se pueden
pueden crear
crear instancias
instancias de
de
una
una interfaz.
interfaz.

Implementa
Implementa las
las operaciones
operaciones heredadas.
heredadas.
Se
Se pueden
pueden crear
crear instancias
instancias de
deuna
una clase
clase
concreta.
concreta.

75

28

Anda mungkin juga menyukai