Está en la página 1de 23

Lenguaje de programación III

Tema 03
Herencia

Lic. Luis Ernesto Díaz Beteta


Contenido
• Introducción
• Tipos de derivación
• Clases derivadas
• Redefinición de miembros
• Constructores de clases derivadas
• Encapsulamiento
• Patrón Delegation
Introducción
La herencia en genética es el proceso por el cual las
características de los individuos se transmiten a su
descendencia, ya sean características fisiológicas,
morfológicas o bioquímicas de los seres vivos bajo
diferentes condiciones ambientales.
Cont…
La HERENCIA es un potente mecanismo de creación de
una clase a partir de una clase existente.
• Es una propiedad que permite que los objetos sean creados a partir
de otros ya existentes.
• Obteniendo características (métodos y atributos) similares a los
ya existentes.

• Es la relación entre una clase general y otra clase mas especifica.

• Nos permite compartir automáticamente métodos y datos entre


clases

Por ejemplo: Si declaramos una clase párrafo derivada de un clase


texto todos los métodos y variables asociadas con la clase texto son
automáticamente heredados por la subclase párrafo.
Cont…
• La clase de la cual se heredan sus características, recibe
el nombre de clase base

• La clase que esta heredando de la clase base, es


conocida como clase derivada o sub clase
Tipos de herencia
Cuando la clase ClaseA
derivada posee una
sola clase base, se
conoce como ClaseB ClaseC
derivación simple

Cuando la clase ClaseA ClaseB


derivada posee dos o
más clases bases, se
conoce como
derivación múltiple ClaseC
Clases derivadas
Tipo definido por el usuario que tiene la propiedad
de heredar los datos y funciones miembros de una
clase, denominada clase base

Sintaxis
class CDerivada : CBase
{
//cuerpo de la clase derivada
}
Ejemplo Derivación
class CBase{ class CDerivada : CBase{
public CBase(){ } public CDerivada(){ }
public void Mostrar(){ } public void Mostrar(){ }
} }

Objeto de la clase derivada


CDerivada obj = new CDerivada;
Redefinición de miembros
Es cuando en la clase derivada, se redefine una
función miembro de la clase base.

class CBase{ class CDerivada : CBase{


//... //...
public void Mostrar(){ public void Mostrar(){
//Código del método //Código del método
} }
} }

Al redefinir el método de la clase base en la clase


derivada , el método de la clase derivada se súper pone
al método de la clase base.
Cont…
CDerivada obj = new CDerivada;
obj.Mostrar();

Al realizar la llamada al
método Mostrar desde un
objeto de la clase derivada,
solo se ejecutara este y no el
de la clase base
Solución !!!
public void Mostrar() {
base.Mostrar(); //llamada al método de CBase
System.Console.WriteLine("CDerivada::Mostrar( )");
}
Constructores y herencia
Los objetos de clase base siempre se construyen antes
que cualquier clase derivada.

De esta forma, el constructor de la clase base se ejecuta


antes que el constructor de la clase derivada.

Si la clase base tiene más de un constructor, la clase


derivada puede decidir a qué constructor se va a llamar.

• Los constructores por omisión son llamados de forma


implícita
• No es necesario especificar la llamada al constructor
de la clase base.
ejemplo
class CBase{
public CBase(){
System.Console.WriteLine("Constructor CBase");
}

public CBase(int n){


System.Console.WriteLine("Constructor con parametros CBase");
}
}

class CDerivada : Cbase {


public CDerivada() {
System.Console.WriteLine("Constructor CDerivada");
}

public CDerivada(int n) : base( n ) {


System.Console.WriteLine("Constructor con parametros CDerivada ");
}
}
CDerivada obj = new CDerivada(1);
Encapsulamiento y herencia
Las variables declaradas como protected en la clase base no podrán
ser accedidas desde fuera de la clases derivadas.

¿Qué es un Assembly?
Un assembly puede ser un archivo ejecutable o una librería de enlace dinámico,
que puede poseer código ejecutable y/o recursos(bitmaps, iconos ocualquier
tipo de dato). Cada assembly posee un manifiesto que describe su contenido e
informa de otras propiedades como su nombre, versión, etc.
Clases abstractas
Se utilizan como clases base en jerarquías de herencia
• No pueden utilizarse para instanciar objetos, ya que las clases
abstractas están incompletas
• El propósito, es el de proporcionar una clase base apropiada para así
compartir un diseño común.
• Le llamamos clases concretas a las clases que podemos utilizar para
crear instancias.
• Las clases abstractas son demasiado generales como para poder
crear objetos
• Las clases concretas proporcionan los detalles específicos que
hacen razonable la creación de instancias.
• Para definir una clase como abstracta, se declara con la palabra clave
abstract
• Los métodos abstractos, no proporcionan implementación
• Una clase que posea métodos abstractos, debe declararse
abstracta.
ejemplo
abstract class CFigura{
protected string figura;

public CFigura(string f){ this.figura = f; }

public abstract void Dibujar();


public abstract void TipoFigura();
}

class CCuadro : CFigura {


public CCuadro(string f) : base(f) { }

public override void Dibujar() {


System.Console.WriteLine("Dibujando CUADRO");
}
public override void TipoFigura(){
System.Console.WriteLine("FIGURA: " + figura);
}
}
ejemplo
class CCirculo : CFigura {
public CCirculo(string f) : base(f) { }

public override void Dibujar(){


System.Console.WriteLine("Dibujando CIRCULO");
}
public override void TipoFigura(){
System.Console.WriteLine("FIGURA: " + figura);
}
} static void Main(string[] args){
CFigura figura1 = new CCirculo("circulo");
CFigura figura2 = new CCuadro("cuadrado");

figura1.Dibujar();
figura1.TipoFigura();

figura2.Dibujar();
figura2.TipoFigura();

System.Console.Read();
}
Delegación
Es una técnica en la que un objeto de cara al exterior expresa cierto
comportamiento pero en realidad delega la responsabilidad de
implementar dicho comportamiento a un objeto asociado en una
relación inversa de responsabilidad.

• Este patrón ha sido descrito como una manera de realizar “herencia


múltiple manualmente mediante composición de objetos.
• La delegación es utilizada como un mecanismo para centralizar en
torno a un solo objeto los compartimentos de varios objetos donde
dichos comportamientos mantienen cierto nivel de relación.
• Podemos implementar Delegation de dos maneras,
• Haciendo uso de objetos dentro de otro (composición)
• Utilización de interfaces; permitiendo que la implementación del
patrón pueda ser realizada, sin embargo en ocasiones la relación
deseada entre clases es de contención en vez de herencia.
• Delegation no se limita solo a escenarios donde se debe evitar la
herencia múltiple (la herencia múltiple no es permitida en Java)
, pero se puede ver como una alternativa general a la herencia.
Cont…
Delegation no se limita solo a escenarios donde se debe evitar la
herencia múltiple (la herencia múltiple no es permitida en Java, ni en
C#), pero se puede ver como una alternativa general a la herencia.

• Este patrón se usa comúnmente en casos donde:


• Se desea reducir el acoplamiento de métodos para una clase.
• Existen componentes que tienen comportamientos similares,
pero que en un futuro es posible que se realicen cambios.
• Se desea remplazar la herencia, generalmente se usa la
delegación como alternativa a la herencia.
Hay que tener en cuenta que la herencia a pesar de ser una buena
estrategia para ser utilizada cuando existe una estrecha relación entre
las clases involucradas, no es recomendada cuando la relación no es
tan estrecha, ya que se crea una lazo de dependencia directa entre
las clases; por otra parte la delegación es la forma más flexible para
expresar una relación entre clases.
Cont…
ejemplo
class Persona{
private string nombre;
private string fnac;

public Persona(string nombre, string fnac) {


this.Nombre = nombre;
this.Fnac = fnac;
}
public string Nombre {
set { nombre = value; }
get { return nombre; }
}
public string Fnac {
set { fnac = value; }
get { return fnac; }
}
}
Cont…
class Estudiante{
private Persona per;
private string carrera;

public Estudiante( string nombre, string fnac, string carrera ){


per = new Persona( nombre, fnac );
this.Carrera = carrera;
}

public string Carrera{


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

public void Mostrar() {


System.Console.WriteLine("Nombre "+per.Nombre);
System.Console.WriteLine("Fecha de nacimiento " + per.Fnac);
System.Console.WriteLine("Carrera " + this.Carrera);
}
}
Cont…
static void Main(string[] args)
{
Estudiante estu = new Estudiante("Ernesto","31/08/1990", "Sistemas");
estu.Mostrar();
System.Console.Read();
}
Muchisimas
Gracias

También podría gustarte