You are on page 1of 78

Programacin con C# .

NET
Tema 5: Orientacin a Objetos con C#

El lenguaje C# y la orientacin a objetos


Hola, mundo de nuevo Definicin de clases simples Instancias de nuevos objetos Uso del operador this

C#

Hola, mundo de nuevo


using using System; System; class class Hello Hello { { public public static static int int Main( Main( ) ) { { Console.WriteLine(Hello, Console.WriteLine(Hello, World); World); return return 0; 0; } } } }

C#

Definicin de clases simples


Datos y mtodos juntos dentro de una clase Los mtodos son pblicos, los datos son privados

class class CuentaBancaria CuentaBancaria Mtodos Mtodos pblicos pblicos { { describen describen un un public void Retirar(decimal cantidad) public void Retirar(decimal cantidad) comportamiento comportamiento { accesible accesible { ... ... } } public public void void Ingresar(decimal Ingresar(decimal cantidad) cantidad) Campos { Campos privados privados { ... ... } } describen describen un un private private decimal decimal balance; balance; estado estado private string name; private string name; inaccesible inaccesible } }

C#

Instancias de nuevos objetos


Al declarar una variable de clase no se crea un objeto Para crear un objeto se usa el operador new

class class Program Program ahora hora { minuto { static static void void Main( Main( ) ) nuevo suya { ... objeto { ... CuentaBancaria Reloj ahora; Reloj ahora; ahora.hora ahora.hora = = 11; 11; Cuenta Cuenta Bancaria Bancaria suya suya = = new new CuentaBancaria( CuentaBancaria( ); ); suya.Ingresar(999999M); suya.Ingresar(999999M); } } } }

C#

Uso de la palabra reservada this


La palabra reservada this apunta al objeto usado para la llamada al mtodo Es til en caso de conflicto entre identificadores de distintos mbitos

class class CuentaBancaria CuentaBancaria { { ... ... public public void void PoneNombre(string PoneNombre(string nombre) nombre) Si esta instruccin fuera { { nombre = nombre; this .nombre = nombre; this.nombre = nombre; qu ocurrira? } } private private string string nombre; nombre; } }

C#

Definicin de sistemas orientados a objetos


Herencia Jerarquas de clases Herencia sencilla y mltiple Polimorfismo Clases base abstractas Interfaces

C#

Herencia

La herencia indica una relacin es un tipo de" La herencia es una relacin entre clases Las nuevas clases aaden especializacin a las existentes

Generalizacin

Msico Msico

Clase base

Especializacin

Violinista Violinista

Clase derivada

Es ste un buen ejemplo de herencia ?

C#

Jerarquas de clases

Las clases con relaciones de herencia forman jerarquas de clases


Msico Msico toca Instrumento Instrumento musical musical

Msico Msico de de cuerda cuerda

toca

Instrumento Instrumento de de cuerda cuerda

??? ???

Violinista Violinista

toca

Violn Violn

??? ???

C#

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 Violn tiene una sola clase base directa

Instrumento Instrumento de de cuerda cuerda Instrumento de cuerda tiene dos clases base directas

C#

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( )) Un Un mtodo mtodo sin sin cuerpo cuerpo se se llama llama operacin operacin

Guitarrista Guitarrista AfinaTuInstrumento( AfinaTuInstrumento( ))

Violinista Violinista AfinaTuInstrumento( AfinaTuInstrumento( ))

C#

Clases base abstractas


Algunas clases existen slo para ser clases base No tiene sentido crear instancias de estas clases
Estas

clases son abstractas


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

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

C#

Interfaces

Las interfaces contienen slo operaciones, no implementacin


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

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

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

Violinista Violinista concrete concrete

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

C#

Uso de variables de tipo referencia


C#

Notas generales
Uso de variables de tipo referencia Uso de tipos referencia comunes La jerarqua de objetos Espacios de nombres en .NET Framework

C#

Uso de variables de tipo referencia


Comparacin de tipos valor y tipos referencia Declaracin y liberacin de variables referencia Referencias no vlidas Comparacin de valores y comparacin de referencias Referencias mltiples a un mismo objeto Uso de referencias como parmetros de mtodos

C#

Comparacin de tipos valor y tipos referencia


Tipos valor La variable contiene el valor directamente Ejemplos: char, int

Tipos referencia

La variable contiene una referencia al dato El dato se almacena en un rea de memoria aparte
string string mol; mol; mol mol = = Hola"; Hola";

int int mol; mol; mol mol = = 42; 42;

Hola Hola

42 42 C#

Declaracin y liberacin de variables referencia


Declaracin de variables referencia

coordenada coordenadac1; c1; c1 c1==new newcoordinate(); coordinate(); c1.x c1.x==6.12; 6.12; c1.y c1.y==4.2; 4.2;

6.12 6.12

4.2 4.2

Liberacin de variables referencia


c1 c1 = = null; null;

6.12 6.12

4.2 4.2 C#

Referencias no vlidas

Si hay referencias no vlidas No es posible acceder a miembros o variables Referencias no vlidas en tiempo de compilacin El compilador detecta el uso de referencias no inicializadas Referencias no vlidas en tiempo de ejecucin El sistema generar un error de excepcin

C#

Comparacin de valores y comparacin de referencias


Comparacin de tipos valor == and != comparan valores Comparacin de tipos referencia == and != comparan las referencias, no los valores

1.0 1.0 1.0 1.0

2.0 2.0 2.0 2.0 C#

Diferente

Referencias mltiples a un mismo objeto


Dos referencias pueden apuntar a un mismo objeto Dos formas de acceder a un mismo objeto para lectura/escritura

c1 c2

2.3 2.3

7.6 7.6

coordinate coordinate c1= c1= new new coordinate coordinate ( ( ); ); coordinate coordinate c2; c2; c1.x c1.x = = 2.3; 2.3; c1.y c1.y = = 7.6; 7.6; c2 c2 = = c1; c1; Console.WriteLine(c1.x Console.WriteLine(c1.x + +" ", ," "+ + c1.y); c1.y); Console.WriteLine(c2.x Console.WriteLine(c2.x + +" ", ," "+ + c2.y); c2.y);

C#

Uso de referencias como parmetros de mtodos


Las referencias se pueden usar como parmetros Si se pasan por valor, es posible cambiar el dato referenciado

2 23 3

3 34 4

static static void void PassCoordinateByValue(coordinate PassCoordinateByValue(coordinate c) c) { { c.x++; c.x++; c.y++; c.y++; } } loc.x loc.x = = 2; 2; loc.y loc.y = = 3; 3; PassCoordinateByValue(loc); PassCoordinateByValue(loc); Console.WriteLine(loc.x Console.WriteLine(loc.x + +" ", ," "+ + loc.y); loc.y);

C#

Uso de tipos referencia comunes


Clase Exception Clase String Mtodos, operadores y propiedades comunes de String Comparaciones de cadenas de caracteres Operadores de comparacin en String

C#

Clase Exception
Exception es una clase Los objetos Exception se usan para lanzar excepciones

Para

crear un objeto Exception se usa new Para lanzar el objeto se usa throw

Los tipos Exception son subclases de Exception

C#

Clase String
Cadenas de caracteres Unicode Abreviatura de System.String Inmutable
string string s s= = "Hola"; "Hola"; s[0] s[0] = = 'c'; 'c'; // // Error Error al al compilar compilar

C#

Mtodos, operadores y propiedades comunes de String


Corchetes Mtodo Insert Propiedad Length Mtodo Copy Mtodo Concat Mtodo Trim Mtodos ToUpper y ToLower

C#

Comparaciones de cadenas de caracteres


Mtodo Equals Comparacin de valores Mtodo Compare Ms comparaciones Opcin para no distinguir maysculas y minsculas Ordenacin alfabtica Opciones locales de Compare C#

Operadores de comparacin en String


Los operadores == y != estn sobrecargados para cadenas Son equivalentes a String.Equals y !String.Equals

string string a a= = "Test"; "Test"; string string b b= = "Test"; "Test"; if // if (a (a == == b) b) ... ... // Devuelve Devuelve true true

C#

La jerarqua de objetos
El tipo object Mtodos comunes Reflexin

C#

El tipo object
Sinnimo de System.Object Clase base para todas las dems clases

Object Object String String Exception Exception SystemException SystemException C# MyClass MyClass

Mtodos comunes

Mtodos comunes para todos los tipos referencia


Mtodo

ToString Mtodo Equals Mtodo GetType Mtodo Finalize

C#

Reflexin

Es posible obtener informacin sobre el tipo de un objeto Espacio de nombres System.Reflection El operador typeof devuelve el tipo de un objeto Slo para clases en tiempo de compilacin Mtodo GetType en System.Object Informacin sobre clases en tiempo de ejecucin

C#

Conversiones de datos

Conversin de tipos valor Conversiones padre/hija El operador is El operador as Conversiones y el tipo object Conversiones e interfaces Boxing y unboxing

C#

Conversin de tipos valor


Conversiones implcitas Conversiones explcitas

Operador

de cast

Excepciones Clase System.Convert



Control

interno de conversiones

C#

Conversiones padre/hija

Conversin a referencia de clase padre


Implcita

o explcita Siempre tiene xito Siempre se puede asignar a un objeto


Conversin a referencia de clase hija


Es

necesario cast explcito Comprueba que la referencia es del tipo correcto Si no lo es, causa una excepcin InvalidCastException

C#

El operador is

Devuelve true si es posible realizar una conversin


Pajaro Pajaro b; b; if if (a (a is is Pajaro) Pajaro) b b= = (Pajaro) (Pajaro) a; a; // // No No hay hay problema problema else else Console.WriteLine("No Console.WriteLine("No es es Pjaro"); Pjaro");

C#

El operador as

Hace conversiones entre tipos referencia, como cast En caso de error Devuelve null No causa una excepcin

Pajaro Pajaro b b= =a a as as Pajaro; Pajaro; // // Convertir Convertir if if (b (b == == null) null) Console.WriteLine("No Console.WriteLine("No es es Pjaro); Pjaro);

C#

Conversiones y el tipo object


El tipo object es la base para todas las clases Se puede asignar a object cualquier referencia Se puede asignar cualquier variable object a cualquier referencia Con conversin de tipo y comprobaciones El tipo object y el operador is

object object buey; buey; buey buey = = a; a; buey buey = = (object) (object) a; a; buey buey = =a a as as object; object;

b b= = (Pajaro) (Pajaro) buey; buey; b b= = buey buey as as Pajaro; Pajaro;

C#

Conversiones e interfaces
Una interfaz slo se puede usar para acceder a sus propios miembros No es posible acceder a otros miembros y variables de la clase a travs de la interfaz

C#

Boxing y unboxing

Sistema de tipos unificado Boxing Unboxing Llamadas a mtodos de object en tipos valor

int int p p= = 123; 123; object object box; box; box box = = p; p;

123 123 123 123

p p= = (int)box; (int)box;

C#

Creacin y destruccin de objetos


C#

Descripcin general
Uso de constructores Objetos y memoria

C#

Uso de constructores
Creacin de objetos Uso del constructor por defecto Sustitucin del constructor por defecto Sobrecarga de constructores

C#

Creacin de objetos

Paso 1: Asignacin de memoria Se usa new para asignar memoria desde el montn Paso 2: Inicializacin del objeto usando un constructor Se usa el nombre de la clase seguido por parntesis

Fecha Fecha cuando cuando = = new new Date( Date( ); );

C#

Uso del constructor por defecto


Caractersticas de un constructor por defecto Acceso pblico Mismo nombre que la clase No tiene tipo de retorno (ni siquiera void) No recibe ningn argumento Inicializa todos los campos a cero, false o null Sintaxis del constructor

class class Date Date { { public public Date( Date( ) ){ { ... ... } }} }

C#

Sustitucin del constructor por defecto


El constructor por defecto puede no ser adecuado En ese caso no hay que usarlo, sino escribir otro

Class Class Date Date { { public public Date( Date( ) ) { { ssaa ssaa = = 1970; 1970; mm = 1; mm = 1; dd dd = = 1; 1; } } private private int int ccyy, ccyy, mm, mm, dd; dd; } }

C#

Sobrecarga de constructores

Los constructores son mtodos y pueden estar sobrecargados Mismo mbito, mismo nombre, distintos parmetros Permite inicializar objetos de distintas maneras AVISO Si se escribe un constructor para una clase, el compilador no crear un constructor por defecto

Class Class Date Date { { public public Date( Date( ) ){ { ... ... } } public Date(int anno , , ) public Date(int anno, int int mes mes , int int dia dia ){ { ... ... } } ... ... } }

C#

Objetos y memoria
Tiempo de vida de un objeto Objetos y mbito Recoleccin de basura

C#

Tiempo de vida de un objeto


Creacin de objetos
Se

Uso de objetos
Llamadas Se

usa new para asignar memoria Se usa un constructor para inicializar un objeto en esa memoria a mtodos

Destruccin de objetos

vuelve a convertir el objeto en memoria Se libera la memoria

C#

Objetos y mbito

El tiempo de vida de un valor a local est vinculado al mbito en el que est declarado Tiempo de vida corto (en general) Creacin y destruccin deterministas El tiempo de vida de un objeto dinmico no est vinculado a su mbito Tiempo de vida ms largo Destruccin no determinista

C#

Recoleccin de basura

No es posible destruir objetos de forma explcita C# no incluye un inverso de new (como delete) Ello se debe a que una funcin de eliminacin explcita es una importante fuente de errores en otros lenguajes Los objetos se destruyen por recoleccin de basura Busca objetos inalcanzables y los destruye Los convierte de nuevo en memoria binaria no utilizada Normalmente lo hace cuando empieza a faltar memoria

C#

Herencia en C#

C#

Notas generales
Derivacin de clases Implementacin de mtodos Uso de clases selladas Uso de interfaces Uso de clases abstractas

C#

Derivacin de clases
Extensin de clases base Acceso a miembros de la clase base Llamadas a constructores de la clase base

C#

Extensin de clases base


Sintaxis para derivar una clase desde una clase base


Token Token concrete concrete

class class Token Token Clase Clase { Clasebase base Clasederivada derivada { ... ... } } class class ComentToken: ComentToken: Token Token { { 2 ... 2puntos puntos ... } }

ComentToken ComentToken concrete concrete

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

C#

Acceso a miembros de la clase class Token class Token base { ... class { ... class Outside Outside
} } class class ComentToken: ComentToken: Token Token { ... { ... public public string string Name( Name( ) ) { { return return name; name; } } } } protected protected string string name; name; { { void void Fails(Token Fails(Token t) t) { { ... ... t.name t.name ... ...

} }

} }

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 En una struct no se usa el modificador de acceso protected

C#

Llamadas a constructores de la clase base


Las declaraciones de constructores deben usar la palabra base

class class Token Token { { protected protected Token(string Token(string name) name) { { ... ... } } ... ... } } class class ComentToken: ComentToken: Token Token { { public (name) public ComentToken(string ComentToken(string name) name) : : base base (name) { {} } ... ... } }

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

C#

Implementacin de mtodos
Definicin de mtodos virtuales Uso de mtodos virtuales Sustitucin de mtodos (override) Uso de mtodos override Uso de new para ocultar mtodos Uso de la palabra reservada new

C#

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( ) ) { { ... ... } } } }

Los mtodos virtuales son polimrficos C#

Uso de mtodos virtuales


Para usar mtodos virtuales:


No

se puede declarar mtodos virtuales como estticos No se puede declarar mtodos virtuales como privados

C#

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( ) ){ { ... ... } } } }

C#

Uso de mtodos override


Slo se sustituyen mtodos virtuales heredados idnticos

class class Token Token { ... { ... public public int int LineNumber( LineNumber( ) ) { { ... ... } } public virtual string Name( ) { ... public virtual string Name( ) { ... } } } } class class ComentToken: ComentToken: Token Token { { ... ... public public override override int int LineNumber( LineNumber( ) ){ { ... ... } } public override string Name( ) { ... } public override string Name( ) { ... } } }

Un mtodo override debe coincidir con su mtodo virtual asociado 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

C#

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( ) ) { { ... ... } } } }

C#

Uso de la palabra reservada new


Ocultar tanto mtodos virtuales como no virtuales


class class Token Token { ... { ... public public int int LineNumber( LineNumber( ) ) { { ... ... } } public virtual string Name( ) { ... public virtual string Name( ) { ... } } } } class class ComentToken: ComentToken: Token Token { ... { ... new new public public int int LineNumber( LineNumber( ) ) { { ... ... } } public override string Name( ) { ... public override string Name( ) { ... } } } }

Resolver conflictos de nombre en el cdigo Ocultar mtodos que tengan signaturas idnticas

C#

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 { { ... ... } } } }


C#

Uso de interfaces
Declaracin de interfaces Implementacin de varias interfaces Implementacin de mtodos de interfaz

C#

Declaracin de interfaces

Sintaxis: Para declarar mtodos se usa la palabra reservada interface


Los Losnombres nombresde deinterfaces interfaces empiezan Imayscula empiezancon conImayscula

interface interface IToken IToken { { int int LineNumber( LineNumber( ); ); string string Name( Name( ); ); } }
Sin . de Sinespec espec. deacceso acceso M todos sin Mtodos sincuerpo cuerpo

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

C#

Implementacin de varias interfaces


Una clase puede implementar cero o ms interfaces

interface interface IToken IToken { IToken IVisitable { IVisitable IToken string Name( ); string Name( ); interface interface interface interface } } interface interface IVisitable IVisitable { { void void Accept(IVisitante Accept(IVisitante v); v); CVC1 } } 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

C#

Diapositiva 68 CVC1 Todas las declaraciones de mtodos deben nombrar los parmetros
Curro Vzquez; 20/04/2003

Implementacin de mtodos de interfaz


El mtodo que implementa debe ser igual que el mtodo de interfaz 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 Mismoacceso acceso Mismo Mismoretorno retorno Mismo Mismonombre nombre Mismos metros Mismospar parmetros

C#

Uso de clases abstractas


Declaracin de clases abstractas Uso de clases abstractas en una jerarqua de clases Comparacin de clases abstractas e interfaces Implementacin de mtodos abstractos Uso de mtodos abstractos

C#

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 Nose sepueden puedencrear crearinstancias instancias de deuna unaclase claseabstracta abstracta

C#

Uso de clases abstractas en una jerarqua de clases


Ejemplo 1
IToken IToken interface interface

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 { ... { ... } }

Token Token {{ abstract abstract }}

Coment Coment Token Token concrete concrete

Token Token concrete concrete

Keyword Keyword

C#

Uso de clases abstractas en una jerarqua de clases (cont.)


Ejemplo 2

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 KeywordToken: Token, IToken class KeywordToken: Token, IToken { { ... ... } }

Token Token concrete concrete

Keyword Keyword

C#

Comparacin de clases abstractas e interfaces


Parecidos No se pueden crear instancias de ninguna de ellas No se puede sellar ninguna de ellas Diferencias 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

C#

Implementacin de mtodos abstractos


abstract abstract class class Token Token { { public public virtual virtual string string Name( Name( ) ){ { ... ... } } public public abstract abstract int int Longitud( Longitud( ); ); } } class class ComentToken: ComentToken: Token Token { { public public override override string string Name( Name( ) ){ { ... ... } } public public override override int int Longitud( Longitud( ) ){ { ... ... } } } }

Sintaxis: Se usa la palabra reservada abstract

Slo clases abstractas pueden declarar mtodos abstractos Los mtodos abstractos no pueden tener cuerpo

C#

Uso de mtodos abstractos


Los mtodos abstractos son virtuales Los mtodos override pueden sustituir 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 C#

Bibliografa

C#. Curso de Programacin.


Autor:

Fco. Javier Ceballos Sierra. Editorial:


RA-MA en Espaa. Alfaomega Grupo Editor en Amrica.

Enciclopedia de Microsoft Visual C#.


Autor:

Fco. Javier Ceballos Sierra. Editorial:


RA-MA en Espaa. Alfaomega Grupo Editor en Amrica.

You might also like