framework .net 3.5 07 programación orientada a objetos

23
Programación orientada a objetos Conceptos de programación orientada a objetos. Sobrecarga Plantilla desde la que crear objetos. Define las características de un objeto, como los datos que puede contener y las operaciones que pueda efectuar. Es un miembro de clase que representa Instancia de una clase, lo creado a partir de la plantilla definida. La clase es la definición de un ítem y el objeto es el ítem en sí mismo. Es un miembro de clase que Son miembros de clase que contiene Es un miembro de clase que indica que algo le ha ocurrido a un objeto o clase mediante un mecanismo de notificación observadores de la aplicación puedan responder a los mismos. Es la habilidad de un objeto o Es el método para definir varios métodos, con el mismo nombre, en la misma clase, dando a cada uno una firma diferente. La firma incluye el nombre del procedimiento y el número, tipo y orden de sus parámetros.

Upload: antonio-palomares-sender

Post on 23-Jun-2015

1.046 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Conceptos de programación orientada a objetos.

CamposPropiedadesMétodosEventosEncapsulaciónSobrecarga

Plantilla desde la que crear objetos. Define las características de un objeto, como los datos que puede contener y las operaciones que pueda efectuar.

Es un miembro de clase que representa un dato que la clase necesita para completar su diseño.

Instancia de una clase, lo creado a partir de la plantilla definida. La clase es la definición de un ítem y el objeto es el ítem en sí mismo.

Es un miembro de clase que suministra un mecanismo flexible para leer, modificar o calcular los valores de un campo.

Son miembros de clase que contiene bloques de código y representan una acción que el objeto o clase ejecuta. Los métodos pueden acceder a los campos de la clase para cumplir sus tareas.

Es un miembro de clase que indica que algo le ha ocurrido a un objeto o clase mediante un mecanismo de notificación que permite que los observadores de la aplicación puedan responder a los mismos.

Es la habilidad de un objeto o clase para ocultar sus datos internos así como los detalles de la implementación, dejando accesible sólo lo pertinente.

Es el método para definir varios métodos, con el mismo nombre, en la misma clase, dando a cada uno una firma diferente. La firma incluye el nombre del procedimiento y el número, tipo y orden de sus parámetros.

Page 2: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

using System;using System.Collections.Generic;using System.Linq;using System.Text;

namespace Cuentas{ public class Cuenta { }}

Definición de una clase.Mínimo imprescindible, el nombre de la clase y su nivel de acceso.Utilizando Visual Studio para crear la clase dispondremos de una plantilla que nos simplificará el proceso.Solution Explorer -> botón derecho -> Add -> ClassEn el cuadro de diálogo, especificar el nombre y ubicación del archivo que contendrá la nueva clase y revisar el código generado.Los niveles de acceso que podemos utilizar son:

Accesible desde Palabra clave

Cualquier sitio public/Public

La clase que lo contiene private/Private

El propio ensamblado internal/Friend

La propia clase y sus derivadas protected/Protected

El propio ensamblado y clases derivadas protected internal/Protected Friend

Clases sólo

Page 3: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Definición de una clase (II) – El diseñador.El diseñador de clases es una herramienta incluida en Visual Studio 2008 que nos permite simplificar un poco el proceso de crear una clase, haciéndolo totalmente visual.Para ello seleccionaremos ver el diagrama de clases en el menú contextual de la solución.Una vez pulsado veremos el diagrama con las clases ya existentes.Y si pulsamos con el botón derecho veremos el menú contextual asociado a cada clase, en el cual dispondremos de todas las opciones para la generación de clases.En cambio, si pulsamos en el lienzo, se presentará el menú contextual del diseñador, con el cual tendremos las opciones necesarias para la creación de nuevos objetos en el diagrama.Crearemos una nueva clase, llamada Cuenta.Le añadiremos un campo privado, llamado _saldo, de tipo decimal.Le añadiremos un método, llamado Deposito.Después pasaremos a ver el código de la clase para efectuar las correcciones necesarias.Quedando el código como sigue:

Page 4: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

public class Cuenta{

private decimal _saldo;public void Deposito(decimal importe){

_saldo += importe;}

}

Definición de una clase (II) – Campos y Métodos.Las clases disponen de campos para contener sus datos y métodos que definen el

comportamiento de la clase.Se puede definir cualquier número de campos o métodos en una clase, en función

de las necesidades que tengamos.Para definir un campo habremos de darle un nombre, tipo de dato y nivel de acceso

(private por defecto).Las definiciones se pueden situar en cualquier sitio dentro de la clase, aunque, para

facilitar la lectura, se suelen colocar al inicio del código.Para diferenciar los campos de las variables locales se suelen identificar con un

carácter de subrayado inicial.Los métodos son procedimientos o funciones en una clase, con nombre, lista de

parámetros, tipo devuelto y nivel de acceso (private por defecto). Si carece de parámetros, se indica con los paréntesis vacíos, si no retorna nada se indica con void.

Page 5: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

public class Cuenta{

private decimal _saldo;public void Deposito(decimal importe){

_saldo += importe;}public void Deposito(string importe){

_saldo += decimal.Parse(importe);}public void Deposito(int enteros, int decimales){

_saldo += enteros + (decimales / 100);}

}

Definición de una clase (III) – Sobrecarga de métodos.Si una determinada operación puede ser lanzada con diferentes

parámetros, se dará el mismo nombre de método, cambiando la lista de parámetros recibidos y, por supuesto, el código ejecutado en el cuerpo del método.

Page 6: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

public class Cuenta{

private decimal _saldo;public decimal Saldo{

get { return _saldo; }set { _saldo = value; }

}. . .

}

Definición de una clase (IV) - Propiedades.Son las que definen un acceso controlado a los valores de los campos

de la clase, cumpliendo de esta forma con el principio de encapsulación.Son bloques de código que pueden tener un elemento get y un

elemento set para controlar el acceso y modificación de los campos.El elemento get debe retornar un valor del tipo de dato especificado.El elemento set recibirá un parámetro value implícito, con los datos

pasados desde el código cliente.

Page 7: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

public class Cuenta{

. . .public Cuenta(decimal importe){

_saldo = importe;}~Cuenta(){

_saldo = 0;}. . .

}

Definición de una clase (V) – Constructor y Destructor.Son métodos especiales, llamados automáticamente por el CLR, en la creación

de una nueva instancia y a la hora de disponer de una instancia no referenciada.El constructor es el encargado de realizar la inicialización de los campos del

objeto. Este método admite sobrecarga, en el caso de que pueda haber varios parámetros de inicialización. Si no definimos constructor, el sistema genera automáticamente uno sin parámetros.

El destructor se invoca antes de destruir el objeto, para que podamos codificar un cierre ordenado de los recursos utilizados, caso de tenerlos, no es obligatorio.

Page 8: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

public class Cuenta{

private static decimal _tasa = 0.05m;public static decimal Tasa{

get { return _tasa; }set { _tasa = value; }

}public static void aumentarTasa(decimal incremento){

_tasa += incremento;}. . .

}

Definición de una clase (VI) – Miembros de clase.Los miembros vistos hasta ahora han sido de instancia, es

decir, válidos para los objetos creados a partir de la clase.También existen miembros de clase, que no necesitarán una

instancia para poder ser utilizados.Se definen con la palabra clave static/Shared.

Page 9: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

[SerializableAttribute()]public class Cuenta{

. . .}

Definición de una clase (VII) – Atributos.Los atributos son información complementaria a una clase o miembro

que suministran metadatos adicionales al compilador.El Framework dispone de atributos predefinidos como:

Todos ellos son clases que heredan de System.Attribute

Atributo Descripción

SerializableAttribute Indica que la clase puede serializarse, transformarse en un stream de bytes.

WebServiceAttribute Provee información adicional sobre un servicio Web XML, como el nombre y espacio de nombres del servicio.

WebPermissionAttribute Indica que URI y expresiones regulares pueden utilizarse.

<SerializableAttribute()>Public Class Cuenta

. . .End Class

Page 10: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

namespace Cuentas{ class Program { static void Main(string[] args) { Cuenta nuevaCuenta = new Cuenta(2000); nuevaCuenta.Deposito(500); nuevaCuenta.Deposito("100"); nuevaCuenta.Deposito(200,50); nuevaCuenta.Saldo = 300; Console.WriteLine("Saldo: {0}", nuevaCuenta.Saldo); Console.ReadKey(); } }}

Instanciar una clase (I) – Creación y uso de una instancia.Una vez completada la definición de una clase, podemos pasar a utilizarla creando

instancias de la misma e invocando sus propiedades, métodos y miembros accesibles.Para ello habremos de utilizar la palabra clave new, seguida del nombre de la clase y

unos paréntesis con la lista de parámetros que hayamos de pasar al constructor.Esto nos devolverá una instancia de la clase, la cual asignaremos a una variable del

tipo adecuado para poder acceder posteriormente a la misma.Para acceder a un miembro de la instancia, deberemos utilizar el nombre de la variable,

seguido de un punto y el nombre del miembro que deseemos utilizar.Cuando se trate de un método, habremos de incluir los paréntesis y la lista de

parámetros que el método requiera, si se trata de una propiedad no será necesario, y el sistema determinará si ha de usar el método get o set, en función del uso que estemos haciendo de la propiedad.

Page 11: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Instanciar una clase (II) – Creación y destrucción de objetos.El CLR es el encargado de asignar la memoria para los objetos

que creamos y de liberarla cuando dejan de tener referencia.También es el encargado de gestionar la memoria necesaria para todos

los recursos que utilicen nuestros objetos, como puedan ser los punteros de archivo, las conexiones a bases de datos y el propio espacio de memoria para elementos adicionales.

Esta gestión es automática, pero conocer el funcionamiento nos hará diseñar mejores soluciones.

Para el cierre ordenado de los recursos que no gestiona directamente el CLR, como conexiones a bases de datos o archivos abiertos, es conveniente el definir un método Dispose. Para lo cual habremos de implementar el interfaz Idisposable y llamar al método desde el destructor. Así podremos efectuar la liberación de recursos desde nuestro código, ejecutando el método Dispose o bien lo hará el garbage collector al llamar al destructor, el cual invocará el Dispose.

Pero no tenemos control de cuando se ejecutará el garbage collector , por lo que, si el uso de recursos es intensivo, esta codificación es imprescindible.

Page 12: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Implementar herencia - ¿Qué es herencia?La herencia es el mecanismo que nos permite definir nuevas

clases basándonos en unas ya existentes. De esta forma, lo ya definido en la clase base (original) no se ha de volver a definir en la clase derivada.

Las principales ventajas de la herencia son:Mejoran la productividad del desarrollador, al poder reusar el código ya desarrollado.Modelado del mundo real, ya que podremos generar estructuras jerárquicas parecidas a las reales.Consistencia, ya que todas las funcionalidades comunes estarán definidas una única vez, evitándose las duplicaciones.

Cuenta

CuentaCorriente CuentaAhorro CuentaInversion

Page 13: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Implementar herencia (II) –Clases base y derivadas.Clase base:Especificar el nivel de acceso para sus miembros, protected para que puedan acceder las derivadas o private en caso contrario.Definir cuáles serán los miembros a sobrescribir, mediante virtual.

Clases derivadas:Especificar la clase base, sólo una, mediante ":".Definir miembros adicionales, ya que todo lo presente en la clase base ya está en la derivada, excepto los constructores.Acceder a los miembros de la clase base, al menos a todos los que no sean privados (private).Sobrescribir los miembros de la clase base, los marcados como virtual en la clase base.

Page 14: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Implementar herencia (III) –¿Qué es polimorfismo?El polimorfismo es un concepto clave dentro de la herencia,

aunque es quizás complejo de captar.Se trata, básicamente, de la posibilidad de trabajar con clases

derivadas, accediendo mediante la clase base, sin tener que preocuparse de que clase derivada concreta es la que estamos utilizando en cada caso.

Evidentemente, en este caso, sólo podremos acceder a los miembros definidos en la clase base, ya sean implementados en ella o en las derivadas mediante sobrescritura.

Este sistema nos brinda los beneficios de consistencia y simplicidad en nuestro código y de extensibilidad, al admitir futuras clases derivadas sin requerir modificación del código.

Imaginemos nuestra clase Cuenta, como clase base, y dos clases hijas, CuentaCorriente y CuentaInversión, tal y como hemos visto en el diagrama anterior.

Asumamos un método Reintegro en nuestra clase base marcado como virtual y, por lo tanto, implementado en las clases derivadas.

Page 15: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

static void Main(string[] args){

Cuenta corriente = new CuentaCorriente(100);Cuenta inversion = new CuentaInversion(100);corriente.Reintegro(200);inversion.Reintegro(200);Console.WriteLine("CC: {0}, CI: {1}",

corriente.Saldo.ToString(), inversion.Saldo.ToString());Console.ReadKey();

}

Implementar herencia (III) –¿Qué es polimorfismo? (II)Está claro que esto se hará así por ser diferentes, en algún sentido,

las implementaciones del método en las clases derivadas, aunque esta diferencia no viene al caso.

Podremos, sin embargo, ejecutar estos métodos sin tener que estar pendientes del tipo de clase derivada mediante un código del tipo siguiente:

Page 16: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetosImplementar herencia (IV) – Sobrescribir miembros base.

Como ya se ha comentado, en las clases derivadas se pueden sobrescribir los miembros (propiedades o métodos) virtuales de la clase base.

Si no se sobrescriben los miembros virtuales, la clase derivada hereda automáticamente la implementación del mismo que esté definida en la clase base.

Para sobrescribir un método deberá emplease la palabra clave override a continuación del calificador de ámbito de acceso.

Una peculiaridad es que se puede utilizar la sobrescritura para añadir validaciones, por ejemplo, y a continuación invocar la ejecución del código definido en la clase base mediante el uso de base.nombre_método(lista_parámetros).

Si en una clase derivada hemos de acceder a alguno de los campos privados definidos en la clase base, deberemos efectuarlo mediante la correspondiente propiedad, siempre y cuando la hayamos definido en la clase base, lógicamente.

Veamos un ejemplo.

public class Cuenta{ private decimal _saldo; protected decimal Saldo { get { return _saldo; } } public virtual void Ingreso(decimal importe) { _saldo += importe; } public virtual void Reintegro(decimal importe) { _saldo -= importe; } public virtual decimal SaldoDisponible { get { return _saldo; } }}

Public class CuentaAhorro : Cuenta{ private decimal _saldoMinimo; public override void Reintegro(decimal importe) { if (importe <= SaldoDisponible) base.Reintegro(importe); } public override decimal SaldoDisponible { get { return Saldo - _saldoMinimo; } }}

Page 17: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Implementar herencia (V) – Ocultar miembros base.Si una clase derivada contiene algún miembro con el mismo

nombre que alguno de los accesibles de su clase base, deberá resolver el conflicto en alguna de las formas siguientes:

La clase derivada puede indicar que sobrescribe el miembro de la clase base, siempre que sea apropiado, es decir, que el miembro de la clase base está indicado como virtual.La clase derivada puede indicar que oculta el miembro de la clase base, utilizando la palabra clave new, después del indicador de acceso.Si no se toma ninguna de estas acciones el compilador generará un error (warning) indicado el conflicto.

Page 18: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Interfaces - Conceptos.Un interfaz es, básicamente, una clase que define todos sus

miembros, pero que no implementa ninguno de ellos.Habrán de ser las clases que lo implementen las que desarrollen

todos y cada uno de los miembros del interfaz.La otra diferencia con las clases es que se pueden implementar

múltiples interfaces en una sola clase.Se suele decir que un interfaz es un contrato, ya que se asume por

ambas partes que el interfaz no será cambiado y que las clases que lo implementen serán las encargadas de desarrollar toda su funcionalidad.

IComparable ISerializable IDisposable

Cuenta

Page 19: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

public interface Iloggable{

string Ruta {

set; }void Log(bool detalles);

}

Interfaces - Creación.

La sintaxis para definir un interfaz es similar a la de las clases, con la excepción de la palabra clave interface, en lugar de class.

Page 20: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

public class Cuenta : ILoggable{

private string _ruta;#region ILoggable Membersstring ILoggable.Ruta{

// throw new NotImplementedException();set { _ruta = value; }

}void ILoggable.Log(bool detalles){

// throw new NotImplementedException();Console.WriteLine("Detalles: {0}", detalles);

}#endregion- - -

}

Interfaces - Implementación.Una clase puede implementar cualquier número de interfaces.En el caso de no implementar todos los miembros de un interfaz, la

clase deberá ser declarada como abstracta, con lo que no podrá ser instanciada y delegará en sus clases derivadas la implementación de los miembros omitidos.

Page 21: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Interfaces – Guías para el uso de interfaces.Use convenciones de denominación consistentes para los interfaces, por ejemplo, iniciarlos con la letra I, como .NET.Use los interfaces para representar facetas atómicas de funcionalidad que puedan tener varias implementaciones.Use interfaces para definir los límites entre subsistemas, con las tareas de alto nivel que deba implementar cada subsistema, cumpliendo con el principio de encapsulación y evitando que una variación de la implementación de un sistema afecte al resto.Use interfaces para disociar clases en un diseño orientado a objetos, utilizando éstos como parámetros en lugar de clases, dando mayor flexibilidad al código futuro.Use interfaces en los límites de una distribución, por ejemplo, para exponerlos en clientes de red, ya que suelen ser más estables que las clases.

Page 22: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Preguntas:

¿Cómo eliges entre implementar una funcionalidad como método o como propiedad?Es mejor implementar siempre métodos y pasarle todos los parámetros necesarios, en los entornos sin estado, como los servicios Web, no se puede estar seguro de que las propiedades se rellenen adecuadamente.

¿Cuántos constructores deben definirse en una clase?Se pueden definir tantos como sea necesario, en función de las necesidades.

¿Cuándo debe definirse un destructor en una clase?Siempre que se consuman recursos costosos y sea necesario asegurar su desbloqueo y limpieza.

¿Cuándo deben definirse los miembros como static/Shared en una clase?Siempre que se tengan métodos que no requieran instancia.

Page 23: Framework .NET 3.5 07 Programación orientada a objetos

Programación orientada a objetos

Preguntas:

¿Cuándo se debe definir un miembro como virtual?Siempre que deseemos permitir que las clases derivadas puedan modificar la implementación aportada.

¿Cuándo se debe definir un miembro como abstract?Siempre que deseemos obligar a que las clases derivadas tengan que implementar el código.

¿Cuándo deben generarse eventos en una clase?Cuando queramos generar un procedimiento callback y deseemos devolver información al proceso que realizó la llamada.