Anda di halaman 1dari 42

PROGRAMACIÓN DE APLICACIONES

Instructor : Nataniel Marcial Chavez

12.05.11 Programación de aplicaciones


PROGRAMACIÓN DE APLICACIONES

II. CONCEPTOS AVANZADOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS.

12.05.11 Programación de aplicaciones


12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Conceptos sobre polimorfismo

El polimorfismo, en programación orientada a objetos, se refiere a la posibilidad de


acceder a un variado rango de funciones distintas a través del mismo interfaz. O sea,
un mismo identificador puede tener distintas formas (distintos cuerpos de función,
distintos comportamientos) dependiendo del contexto en el que se halle. El
polimorfismo se puede establecer mediante sobrecarga, sobre-escritura y enlace
dinámico.

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Sobrecarga

Este término se refiere al uso del mismo identificador u operador en distintos


contextos y con distintos significados.

Si para cada funcionalidad necesitada fuese necesario escribir un método, el código


resultante sería inmanejable. Supongamos que los desarrolladores de C# hubiesen
creado un método para escribir en pantalla una cadena de texto, otro diferente para
escribir un entero, otro para un doble, y así para todas las combinaciones posibles,
seria casi imposible conocer dichos métodos en totalidad. En cambio, con
“Console.WriteLine()” o “Console.Write()” podemos escribir cualquier mensaje en
pantalla.

Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a


métodos y constructores.

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

La sobrecarga de métodos hace que un mismo nombre pueda representar distintos


métodos con distinto tipo y número de parámetros, manejados dentro de la misma
clase.

En el ámbito de la POO, la sobrecarga de métodos se refiere a la posibilidad de tener


dos o más métodos con el mismo nombre pero distinta funcionalidad. Es decir, dos o
más métodos con el mismo nombre realizan acciones diferentes y el compilador
usará una u otra dependiendo de los parámetros usados.

Esto también se aplica a los constructores (de hecho, es la aplicación más habitual
de la sobrecarga).

Podemos diferenciar varios métodos sobrecargados a través de sus parámetros, ya


sea por la cantidad, el tipo o el orden de los mismos. Veamos un ejemplo:

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public class Articulo


{

private double precio;

public void setPrecio()


{
precio = 3.50;
}
public void setPrecio(float nuevoPrecio)
{
precio = nuevoPrecio;
}
public void setPrecio(float costo, int porcentajeGanancia)
{
precio = costo + (costo * porcentajeGanancia);
}
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Sobreescritura

La sobreescritura se aplica a los métodos y está directamente relacionada a la


herencia; se refiere a la redefinición de los métodos de la clase base en las subclases.

Por ejemplo, en la relación de herencia del ejemplo de las figuras aunque la clase
base “Figura” tiene los métodos “calcularArea” y “calcularPerimetro”, las subclases
“Circulo”, “Cuadrado”, “Triangulo” y “Rectangulo” redefinen estos métodos ya que el
calculo del área y el perímetro de cada uno de ellos es diferente.

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

class Figura {

protected double area;


protected double perimetro;

public Figura() {
this.area=0;
this.perimetro=0;
}
public double getArea() {
return area;
}
public double getPerimetro() {
return perimetro;
}
public void calcularArea(){}
public void calcularPerimetro(){}
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

using System;

public class Circulo : Figura {

public const double PI=3.1415926;


private double radio;

public Circulo() {

}
public double getRadio() {
return radio;
}
public void setRadio(double radio) {
this.radio = radio;
}
public void calcularArea() {

this.area = PI* Math.Pow(this.radio,2.0);


}
public void calcularPerimetro() {
this.perimetro = 2*PI*this.radio;
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Enlace dinámico

Esto permite invocar operaciones en objetos obviando el tipo actual de éstos hasta el
momento de ejecutar el código. O sea, nos permite definir elementos como un tipo e
instanciarlos como un tipo heredado. Pero ¿qué utilidad tiene obviar el tipo de un
objeto para luego tomar esta decisión?.

Gracias a que en C# la definición de los tipos de objetos se puede producir por


Herencia, no nos debe preocupar a qué tipo de elemento le paso un mensaje, ya que el
compilador tomará la decisión sobre qué objeto ejecutará qué método de acuerdo a la
forma de crear la instancia.

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Este concepto es bastante complejo de entender, ya que estamos acostumbrados a


definir los elementos de acuerdo a lo que necesitamos.

Es decir, si requiero un entero lo declaro como entero, para que declarar un elemento
como un tipo y luego usarlo como otro?.

La respuesta está en que no siempre se puede determinar exactamente el tipo de


elemento que va a usarse en la ejecución de nuestro programa.

Se debe tener por lo menos una relación de herencia que permita determinar un tipo
base para la declaración, sea cual sea el subtipo que se instancie.

Veamos un ejemplo que nos aclare un poco las cosas:

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

using System;
using System.Text;

class Mamifero
{
public void mover() {
Console.WriteLine("Ahora es un mamifero el que se mueve");
}
}

class Perro : Mamifero


{
public void mover() {
Console.WriteLine("Ahora es un perro el que se mueve");
}
}

class Gato : Mamifero


{
public void mover() {
Console.WriteLine("Ahora es un gato el que se mueve");
}
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public class Polimorfismo


{
public static void muevete(Mamifero m)
{
m.mover();
}
public static void main(String[] args)
{
Gato bisho = new Gato();
Perro feo = new Perro();
muevete(bisho);
muevete(feo);
}
}
Vemos que el método “muevete” llama al método mover de un mamífero y aunque no sabe
con qué clase de mamífero trata, funciona y se llama al método correspondiente al objeto
específico que lo llama (es decir, primero un gato y luego un perro). Si no existiera el enlace
dinámico, tendríamos que crear un método “muevete” para los mamíferos de tipo “Gato” y
otro para los de tipo “Perro”.

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Veamos otro ejemplo donde las instancias se crean de forma aleatoria:

using System;
using System.Text;

public abstract class Instrumento {


public Instrumento() { }
public abstract void tocar();
public abstract void tocar(String nota);
public abstract void afinar();
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public class Cuerda : Instrumento{


public Cuerda() {}
public void afinar() {
Console.WriteLine("Cuerda.afinar()");
}
public void tocar() {
Console.WriteLine("Cuerda.tocar()");
}
public void tocar(String nota){
Console.WriteLine("Cuerda.tocar()"+nota);
}
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public class Percusion : Instrumento{


public Percusion() {}
public void afinar() {
Console.WriteLine("Percusion.afinar()");
}
public void tocar() {
Console.WriteLine("Percusion.tocar()");
}
public void tocar(String nota){
Console.WriteLine("Percusion.tocar()"+nota);
}
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public class Viento : Instrumento{


public Viento() {}
public void afinar() {
Console.WriteLine("Viento.afinar()");
}
public void tocar() {
Console.WriteLine("Viento.tocar()");
}
public void tocar(String nota){
Console.WriteLine("Viento.tocar()"+nota);
}
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public class LigaduraDinamica {


public static void main(String[] args){
String[] notas = {"Do","Re","Mi","Fa","Sol","La","Si"};
Instrumento [] orquesta = new Instrumento[10];
Random FixRandom = new Random(3);
for(int i=0;i<10;i++){

orquesta[i]=generarInstrumento( FixRandom.Next());
}

for(int i=0;i<10;i++){
afinarInstrumento(orquesta[i]);
}

for(int i=0;i<10;i++){
tocarInstrumento(orquesta[i]);
}

for(int i=0;i<10;i++){
tocarInstrumento(orquesta[i],notas[i%7]);
}
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public static Instrumento generarInstrumento(int i){


switch(i){
default:
case 0:
return new Viento();
case 1:
return new Percusion();
case 2:
return new Cuerda();
}
}

Programación de aplicaciones
12.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public static void afinarInstrumento(Instrumento o){


o.afinar();
}

public static void tocarInstrumento(Instrumento o){


o.tocar();
}

public static void tocarInstrumento(Instrumento o,String nota){


o.tocar(nota);
}
}

Vemos que el método “generarInstrumento” crea aleatoriamente las instancias de los


diferentes tipos de instrumentos y que el arreglo de elementos del tipo de instrumentos es
llenado con diferentes elementos de los cuales sólo sabemos que son objetos basados en
“Instrumento”. Sin embargo, los métodos “tocarInstrumento” y “afinarInstrumento” que
reciben como parámetro un Instrumento llaman adecuadamente a los métodos “afinar” o
“tocar” según la instancia que reciben.

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Clases Abstractas

Las clases abstractas son aquellas que se utilizan en la herencia y sólo las
utilizaremos para que definan el interfaz (qué hacen) y/o la implementación (cómo
lo hacen) de las clases heredadas

No se podrá crear ocurrencias de ellas. Se utilizan para que las características de esta
clase estén disponibles para sus clases heredadas.

Es una forma de generalizar un comportamiento y, por lo tanto, reutilizar código.

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Supongamos que queremos modelar todos los vehículos a motor (coches,


motos, lanchas, ...).

¿Existe en la vida real algún


objeto que sea un vehículo a
motor? NO

Existen coches , motos, etc...

La clase VehiculosAMotor nos


servirá para reutilizar sus
métodos y datos, pero no
para crear ocurrencias de ella.

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

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

public abstract class VehiculosAMotor


{
public abstract void Arrancar();

}
using System;
using System.Collections.Generic;
using System.Text;

public class Carro:VehiculosAMotor


{
public override void Arrancar()
{
Console.WriteLine("Prender motor del carro");

}
} Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

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

class Moto: VehiculosAMotor


{
public override void Arrancar()
{
Console.WriteLine("Prender motor la moto");

}
}

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Clases y miembros de clase abstractos y Sellados

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

La palabra clave abstract permite crear clases y miembros de clase únicamente con
propósitos de herencia: para definir características de clases derivadas, no
abstractas. La palabra clave sealed permite impedir la herencia de una clase o de
ciertos miembros de clase marcados previamente como virtuales.

Clases y miembros de clase abstractos

Las clases se pueden declarar como abstractas. Esto se logra colocando la palabra
clave abstract antes de la palabra clave class en la definición de clase. Por ejemplo:
public abstract class A {
// Class members here.
}
No se pueden crear instancias de una clase abstracta. El propósito de una clase
abstracta es proporcionar una definición común de una clase base que múltiples
clases derivadas pueden compartir. Por ejemplo, una biblioteca de clase puede
definir una clase abstracta que se utiliza como parámetro para muchas de sus
funciones y solicitar a los programadores que utilizan esa biblioteca que
proporcionen su propia implementación de la clase mediante la creación de una
clase derivada.
Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Las clases abstractas también pueden definir métodos abstractos. Esto se consigue
agregando la palabra clave abstract antes del tipo de valor que devuelve el método.
Por ejemplo:

public abstract class A {


public abstract void DoWork(int i);
}

Los métodos abstractos no tienen ninguna implementación, de modo que la definición


de método va seguida por un punto y coma en lugar de un bloque de método normal.
Las clases derivadas de la clase abstracta deben implementar todos los métodos
abstractos. Cuando una clase abstracta hereda un método virtual de una clase base, la
clase abstracta puede reemplazar el método virtual con un método abstracto. Por
ejemplo:

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}

public abstract class E : D


{
public abstract override void DoWork(int i);
}

public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Si un método virtual se declara abstracto, sigue siendo virtual para cualquier


clase que se herede de la clase abstracta. Una clase que hereda un método
abstracto no puede tener acceso a la implementación original del método; en el
ejemplo anterior,

DoWork de la clase F no puede llamar a DoWork de la clase D. De esta forma,


una clase abstracta puede obligar a las clases derivadas a proporcionar nuevas
implementaciones de método para los métodos virtuales.

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

clases y miembros de clase sellados

Las clases pueden declararse como selladas. Esto se logra colocando la palabra clave
sealed antes de la palabra clave class en la definición de clase. Por ejemplo:

public sealed class D


{
// Class members here.
}

Una clase sellada no se puede utilizar como clase base. Por esta razón, tampoco
puede ser una clase abstracta. Las clases selladas se utilizan principalmente para
impedir la derivación. Puesto que nunca se pueden utilizar como una clase base,
algunas optimizaciones en tiempo de ejecución pueden hacer que sea un poco más
rápido llamar a miembros de clase sellada.

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Un miembro de clase, método, campo, propiedad o evento de una clase derivada


que reemplaza a un miembro virtual de la clase base puede declarar ese miembro
como sellado. Esto niega el aspecto virtual del miembro para cualquier clase
derivada adicional. Esto se logra colocando la palabra clave sealed antes de la
palabra clave override en la declaración del miembro de clase. Por ejemplo:

public class D : C
{
public sealed override void DoWork() { }
}

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Interfaces

Las interfaces se definen utilizando la palabra clave interface. Por ejemplo:

interface IComparable
{
int CompareTo(object obj);
}

Las interfaces describen un grupo de comportamientos relacionados que pueden


pertenecer a cualquier clase o estructura. Las interfaces pueden estar compuestas de
métodos, propiedades, eventos, indizadores o cualquier combinación de estos cuatro
tipos de miembros. Una interfaz no puede contener campos. Los miembros de
interfaz son automáticamente públicos.

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Al igual que las clases se pueden heredar de una clase base o estructura, las
clases y estructuras se pueden heredar de interfaces, con dos excepciones:
• Una clase o estructura puede heredar más de una interfaz.
• Cuando una clase o la estructura hereda una interfaz, hereda sólo los
nombres de método y las firmas, ya que la propia interfaz no contiene
ninguna implementación. Por ejemplo:

public class Minivan : Car, IComparable


{
public int CompareTo(object obj)
{
//implementation of CompareTo
return 0; //if the Minivans are equal
}
}

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Para implementar un miembro de interfaz, el miembro correspondiente de la clase


debe ser público, no estático y tener el mismo nombre y la misma firma que el
miembro de interfaz. Las propiedades e indizadores de una clase pueden definir
descriptores de acceso adicionales para una propiedad o indizador definidos en una
interfaz. Por ejemplo, una interfaz puede declarar una propiedad con un descriptor
de acceso get, pero la clase que implementa la interfaz puede declarar la misma
propiedad con descriptores de acceso get y set. Sin embargo, si la propiedad o el
indizador utiliza una implementación explícita, los descriptores de acceso deben
coincidir.
Las interfaces y los miembros de interfaz son abstractos; las interfaces no
proporcionan una implementación predeterminada.

La interfaz IComparable informa al usuario del objeto de que éste se puede


comparar con otros objetos del mismo tipo y el usuario de la interfaz no necesita
saber cómo se implementa.

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Las interfaces pueden heredar otras interfaces. Es posible que una clase herede una
interfaz varias veces, a través de las clases base o interfaces que hereda. En ese caso,
la clase sólo puede implementar la interfaz una vez, siempre que ésta se declare
como parte de la nueva clase. Si la interfaz heredada no está declarada como parte
de la nueva clase, la clase base que la declaró proporcionará su implementación. Es
posible que una clase base implemente miembros de interfaz a través de miembros
virtuales. En ese caso, la clase que hereda la interfaz puede cambiar el
comportamiento de la interfaz reemplazando los miembros virtuales.

Programación de aplicaciones
13.05.11

PROGRAMACIÓN DE APLICACIONES
Conceptos avanzados de la programación orientada a objetos

Una interfaz tiene las siguientes propiedades:


• Una interfaz es similar a una clase base abstracta. Cualquier tipo no abstracto
que hereda la interfaz debe implementar todos sus miembros.
• No se pueden crear instancias directamente de una interfaz.
• Las interfaces pueden contener eventos, métodos, indizadores y propiedades.
• Las interfaces no contienen implementaciones de métodos.
• Las clases y estructuras se pueden heredar de más de una interfaz.
• Una interfaz se puede heredar de varias interfaces.

Programación de aplicaciones
13.05.11

Conceptos avanzados de la programación orientada a objetos

Implementación explícita de interfaz

Programación de aplicaciones
13.05.11

Conceptos avanzados de la programación orientada a objetos

Si una clase implementa dos interfaces que contienen un miembro con la misma
firma, la implementación de ese miembro en la clase hará que ambas interfaces usen
ese miembro como implementación. Por ejemplo:
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
public void Paint()
{
}
}

Programación de aplicaciones
13.05.11

Conceptos avanzados de la programación orientada a objetos

Sin embargo, sI los miembros de dos interfaces no realizan la misma función, esto puede llevar a
una implementación incorrecta de una o ambas interfaces. Es posible implementar un miembro
de interfaz explícitamente, creando un miembro de clase que sólo se llama a través de la interfaz
y es específico de ésta. Esto se puede llevar a cabo asignando al miembro de clase el nombre de
la interfaz y un punto. Por ejemplo:

public class SampleClass : IControl, ISurface


{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}

Programación de aplicaciones
14.05.11

Conceptos avanzados de la programación orientada a objetos

El miembro de clase IControl.Paint sólo está disponible a través de la interfaz


IControl, mientras que ISurface.Paint sólo está disponible a través de ISurface.
Ambas implementaciones de método son independientes y ninguna está
directamente disponible en la clase. Por ejemplo:

SampleClass obj = new SampleClass();

IControl c = (IControl)obj;
c.Paint();

ISurface s = (ISurface)obj;
s.Paint();

Programación de aplicaciones
14.05.11

Conceptos avanzados de la programación orientada a objetos

La implementación explícita también se usa para resolver casos donde cada una de
las dos interfaces declara miembros diferentes del mismo nombre como propiedad
y método: interface ILeft
{
int P { get; }
}
interface IRight
{
int P();
}

Programación de aplicaciones
14.05.11

Conceptos avanzados de la programación orientada a objetos

Para implementar ambas interfaces, una clase tiene que utilizar implementación
explícita, ya sea para la propiedad P, el método P o ambos, con el fin de evitar un error
del compilador. Por ejemplo:

class Middle : ILeft, IRight


{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}

Programación de aplicaciones