You are on page 1of 35

Unidad II.

Herencia y polimorfismo
2.2. Clases bases y clases derivadas. 2.3. Concepto de herencia. 2.4. Tipos de herencia. 2.5. Composicin. 2.6. Concepto de polimorfismo. 2.7. Clases bases abstractas. 2.8. Sobrecarga de mtodos. 2.9. Mtodos virtuales.
Competencias Genricas Solucin de problemas Toma de decisiones. Trabajo en equipo. Capacidad de aplicar los conocimientos Habilidades de investigacin Capacidad de aprender
Criterios de evaluacin Conceptuales: 50% Procedimentales: 40% Actitudinales: 10%

2.2. Clases bases y clases derivadas.


En el lenguaje C# una clase heredada se denomina clase base. La clase base es la parte central de la herencia, en ella estn las caractersticas ms importantes y principales de la resolucin del problema. Podemos ver que para cada clase base podemos definir dos tipos de acceso, public o private. Si no se especifica ninguno de los dos, por defecto se asume que es private.

L a clase que hereda se denomina clase derivada, es decir, se puede crear nuevas clases a partir de las antiguas por el mecanismo de herencia. Se conoce esta tcnica por derivacin. La nueva clase que se crea se denomina clase derivada. El proceso completo es la derivacin de clases.

2.3. Concepto de herencia.


La herencia es la ltima de las propiedades relativas a la POO, Consiste en la propagacin de los atributos y las operaciones a travs de distintas subclases definidas a partir de una clase comn. Introduce, por tanto, una posibilidad de refinamiento sucesivo del concepto de clase. Nos permite definir una clase principal y, a travs de sucesivas aproximaciones, cualquier caracterstica de los objetos. A partir de ahora definiremos como sub-clases todas aquellas clases obtenidas mediante refinamiento de una (o varias) clases principales. La herencia nos permite crear estructuras jerrquicas de clases donde es posible la creacin de sub-clases que incluyan nuevas propiedades y atributos. Estas sub-clases admiten la definicin de nuevos atributos, as como crear, modificar o inhabilitar propiedades.

Sintaxis de la clase base y derivada


class nombre_clase_base { protected tipo_dato nombre_atributos; //mtodos que se necesiten crear public tipo_retorno nombre_mtodo () { //instrucciones; } }
class nombre_clase_derivada : nombre_clase_base { acceso tipo_dato nombre_atributos; //mtodos que se necesiten crear public tipo_retorno nombre_mtodo () { //instrucciones; } }

2.4 Tipos de Herencia


Herencia Simple: En esta jerarqua cada clase tiene como mximo una sola clase base. Esta permite que una clase herede las propiedades de la clase base en una cadena jerrquica.

Ejemplo de herencia
using System; namespace clase_base { class perimetro { protected double lado1,resultado; public perimetro() { lado1=0; resultado=0; } public void leer1() { Console.WriteLine("Lado1: "); lado1= double.Parse (Console.ReadLine()); } }

Ejemplo de herencia
class cuadrado: perimetro { public void calcular() { resultado= 4*lado1; Console.WriteLine("El resultado es: "+ resultado); } } class triangulo: perimetro { protected double lado2,lado3; public void leer2() { Console.WriteLine("Lado2: "); lado2= double.Parse (Console.ReadLine()); Console.WriteLine("Lado3: "); lado3= double.Parse (Console.ReadLine()); }

Ejemplo de herencia
public void calcular() { resultado= lado1+lado2+lado3; Console.WriteLine("El resultado es: " + resultado); } } class Program { static void Main(string[] args) { cuadrado c= new cuadrado(); triangulo t=new triangulo(); c.leer1(); c.calcular(); t.leer1(); t.leer2(); t.calcular(); Console.ReadKey(); } } }

Instrucciones: Realice un programa en donde de la clase base medidas, que tenga un constructor y destructor se hereden todos sus atributos a la clase derivada longitud y reas y ambas clases derivada tengan un mtodo llamado conversion en donde se leer un dato en metros y se convertira cm,dm,mm,yda,pie,pulagada.
medidas m,dm,cm,mm,yda,p ie,pulg

areas longitud conversion()

conversion()

Tarea:
persona nombre direccion fechadenacimiento persona() ~persona()

empleado estudiante calificacion

categoria sueldo
leer() imprimir()

leer() imprimir()

Herencia multinivel
En C# se puede construir jerarquas que contengan tantas capas de herencia como desee. Es decir se puede utilizar una clase derivada como clase base de otra. Ejemplo: figura

Lado1 res rectangulo


lado2 leer() area() triangulo

area()

Ejemplo Herencia multinivel


using System; namespace clase_herencia_multinivel { class figura { protected double lado1,res; public figura() { lado1 = 0; res = 0; } }

Ejemplo Herencia multinivel


class rectangulo : figura { protected double lado2; public void leer() { Console.WriteLine("Base: "); lado1 = double.Parse(Console.ReadLine()); Console.WriteLine("Altura: "); lado2 = double.Parse(Console.ReadLine()); } public void area() { res= lado1 * lado2; Console.WriteLine("Area del rectangulo: " + res + " cm"); } }

Ejemplo Herencia multinivel


class triangulo : rectangulo { public void area() { res = (lado1*lado2)/2; Console.WriteLine("Area del triangulo: " + res); } } class Program { static void Main(string[] args) { rectangulo r = new rectangulo(); triangulo t=new triangulo(); r.leer(); r.area(); t.leer(); t.area(); Console.ReadKey(); }}}

namespace cadenas { class Program { static void Main(string[] args) { string cad; Console.WriteLine("cadena: "); cad = Console.ReadLine(); Console.WriteLine("cadena: " +cad); Console.ReadKey(); } } }

Tarea

plantas nombre tipo Raiz plantas() ~plantas() hojas tipoHoja leer() imprimir() flor nombreFlor leer() imprimir()

animales

Tarea

nom_comun familia habitat animales() ~animales() oviparos tipoOviparo leer() imprimir()

aves

pigmentacion
leer() imprimir()

reptiles caracteristicas leer() imprimir()

2.5. Composicin.
Una agregacin de composicin es aquella que posee (<<contiene>>) a sus partes y entraa una fuerte dependencia de propiedad. Las partes viven en el todo, de modo que se destruyen cuando se destruye el todo. La multiplicidad en el lado parte puede ser un intervalo. Una agregacin de composicin forma un rbol de partes, mientras que un agregado compartido forma una red. Se representa el numero seguido de una lnea y un rombo slido (dibujado de negro) conectado a la parte todo.

Avin
4 * 1..3 2..6

Motor

Asientos

Bodega

Baos

2.6. Concepto de polimorfismo.


El polimorfismo es una nueva caracterstica aportada por la POO. Esta propiedad indica la posibilidad de definir varias operaciones con el mismo nombre, diferencindolas nicamente en los parmetros de entrada. Dependiendo del objeto que se introduzca como parmetro de entrada, se elegir automticamente cual de las operaciones se va a realizar. El polimorfismo y la encapsulacin de datos estn ntimamente ligados y nos permiten un mayor grado de mantenibilidad y reusabilidad que los lenguajes tradicionales. Esta es precisamente una de las causas de la revolucin que ha supuesto la introduccin de los lenguajes orientados a objetos dentro de la programacin.

2.7. Clases bases abstractas.


Las clases abstractas definen un concepto generalizado y sirven para describir nuevas clases. En otras palabras, una clase abstracta es una clase que sirve como clase base para obtener otras clases derivadas. Las clases abstractas no se pueden instanciar (no se puede crear ningn objeto de esa clase) y solo tienen significado como una clase base de otras clases.

En C#, una clase abstracta tiene al menos una funcin miembro que se declara pero no se define; su definicin se realiza en una clase derivada. Debido a que una clase abstracta tiene al menos una funcin que no se puede llamar, no puede ser instanciada.

En las clases abstractas existen los mtodos abstractos, este se crea con el modificador de tipo abstract, un mtodo no tiene ni cuerpo y, por tanto, no lo implementa en la clase base. As, una clase derivada tiene que sustituirlo, y no puede utilizar simplemente la versin que esta definida en la clase base. Para declarar un mtodo abstracto, utilice esta forma general: abstract tipo nombre(lista_parametros);

Cuando una clase derivada hereda una clase abstracta, tiene que implementar todos los mtodos abstractos de la clase base. Si no lo hace, tambien hay que especificar la clase derivada como abstract.

Ejemplo de clase abstracta


using System; namespace clase_abstracta { abstract class figura { protected double lado1, res, lado2; public figura() { lado1 = 0; lado2 = 0; res = 0; } //ahora area es abstracta public abstract void area(); }

Ejemplo de clase abstracta


class rectangulo : figura { public void leer() { Console.WriteLine("Base: "); lado1 = double.Parse(Console.ReadLine()); Console.WriteLine("Altura: "); lado2 = double.Parse(Console.ReadLine()); } public override void area() { res = lado1 * lado2; Console.WriteLine("Area del rectangulo: " + res + " cm"); } }

Ejemplo de clase abstracta


class triangulo : figura { public void leer() { Console.WriteLine("Base: "); lado1 = double.Parse(Console.ReadLine()); Console.WriteLine("Altura: "); lado2 = double.Parse(Console.ReadLine());

} public override void area() { res = (lado1 * lado2) / 2; Console.WriteLine("Area del triangulo: " + res); }
}

Ejemplo de clase abstracta


class Program { static void Main(string[] args) { rectangulo r = new rectangulo(); triangulo t = new triangulo();

r.leer(); r.area(); t.leer(); t.area();

Console.ReadKey(); } } }

2.8. Sobrecarga de mtodos.


La sobrecarga de mtodos es una de las maneras en las que C# implementa el polimorfismo. En general, para sobrecargar un mtodo, simplemente declare diferentes versiones de ese mtodo. El compilador se ocupa del resto. Debe tener en cuenta una restriccin importante: el tipo o el nmero de los parmetros de cada mtodo sobrecargado debe ser distinto. No es suficiente el hecho de que dos mtodos solo se diferencien de por sus tipos devueltos. Deben ser diferentes en los tipos o en el nmero de sus parmetros (los tipos devueltos no proporciona suficiente informacin en todos los casos para que C# decida qu mtodo utilizar). Desde luego, los mtodos sobrecargados pueden diferenciarse tambin en sus tipos devueltos. Cuando se llama un mtodo sobrecargado , se ejecuta la versin del mtodo con parmetros que coinciden con los argumentos

Ejemplo de sobrecarga de mtodos


namespace clasefigurasobrecargademetodos { class figuras { double l1, l2,A; int la1, la2; public figuras() { l1 = 0; l2 = 0; A = 0; } public double leer() { double l; Console.Write("lado: "); l = double.Parse(Console.ReadLine()); return l; }

public int leer(int l) { Console.Write("lado: "); l = int.Parse(Console.ReadLine()); return l; } public void area(int l1,int l2 ) { A = l1 * l2; Console.Write("Area del rectangulo: "+ A);

} public void area(double l1, double l2) { A =( l1 * l2)/2; Console.Write("Area del triangulo: " + A); }

public void area(double l1) {

A = Math.PI * l1 * l1; Console.Write("Area del circulo: " + A);


} } class Program { static void Main(string[] args) { figuras f = new figuras(); int opc; Console.WriteLine("1. AREA DEL RECTANGULO"); Console.WriteLine("2. AREA DEL TRIANGULO"); Console.WriteLine("3. AREA DEL CIRCULO"); Console.Write("Tecle una opcion:"); opc = Int32.Parse(Console.ReadLine());

switch (opc) { case 1: f.area(f.leer(0), f.leer(0)); break; case 2: f.area(f.leer(), f.leer()); break; case 3: f.area(f.leer()); break; } Console.ReadKey();

} } }

2.9. Mtodos virtuales.


Un mtodo virtual es un mtodo que se declara como virtual en una clase base y se vuelve a definir en una o ms clases derivadas. Por tanto, cada clase derivada tiene su propia versin de un mtodo virtual. C# determina que versin del mtodo llamar basndose en el tipo de objeto al que hace referencia la referencia, y esta determinacin se toma en el tiempo de ejecucin. Por tanto, cuando se hace referencia a diferentes objetos, se ejecutan diferentes versiones del mtodo virtual. Un mtodo se declara virtual dentro de una clase base si la palabra clave virtual precede a su declaracin. Cuando una clase derivada vuelve a definir un mtodo, se utiliza el modificador override. Por tanto, el proceso de volver a definir un mtodo virtual dentro de una clase derivada se denomina reemplazo del mtodo. Un mtodo virtual no se puede especificar como static o abstract.

Por qu mtodos de reemplazo?


Los mtodos de reemplazo permiten a C# admitir el polimorfismo en tiempo de ejecucin.
Por tanto, al combinar la herencia con los mtodos de reemplazo, una clase base puede definir la forma general de los mtodos que utilizarn todas su clase derivada.

Ejemplo de mtodos virtuales


namespace metodosvirtuales { class figuras { protected double l1, l2, A; public figuras() { l1 = 0; l2 = 0; A = 0; } public virtual void leer() {

Console.Write("lado: "); l1 = double.Parse(Console.ReadLine());


}

Ejemplo de mtodos virtuales


public virtual void area() { A = l1 * l2; Console.WriteLine("Area del rectangulo: " + A); } } class rectangulo : figuras { public override void leer() { Console.Write("lado1: "); l1 = double.Parse(Console.ReadLine()); Console.Write("lado2: "); l2= double.Parse(Console.ReadLine());

} }

Ejemplo de mtodos virtuales


class circulo : figuras { public override void area() { A = Math.PI* l1 * l1; Console.WriteLine("Area del circulo: " + A); } } class Program { static void Main(string[] args) { rectangulo r= new rectangulo (); circulo c = new circulo(); r.leer(); r.area(); c.leer(); c.area(); Console.ReadKey(); } }}

You might also like