Publicado el 24 de Enero del 2017
3.483 visualizaciones desde el 24 de Enero del 2017
172,3 KB
57 paginas
Creado hace 16a (10/12/2008)
Tema 3: Herencia en C#
Programación Orientada a Objetos
Curso 2008/2009
Begoña Moros Valle
Contenido
Herencia.
Polimorfismo y ligadura.
Clase object.
Casting.
Compatibilidad de tipos.
Clases abstractas.
Interfaces.
Boxing y unboxing.
Herencia múltiple.
Genericidad.
Acciones – Delegados.
Iteradores.
Tema 3
Herencia
2
Herencia
La herencia en C# comparte características
tanto con Java como con C++:
Herencia simple ( = Java )
Herencia pública ( = Java )
Todos las clases heredan directa o indirectamente de
object ( = Java )
Por defecto, no está permitida la redefinición de
métodos ( = C++)
La aplicación de métodos puede resolverse por
ligadura estática o dinámica ( = C++)
Tema 3
Herencia
3
Herencia y constructores
Los constructores no se heredan ( = Java y
C++ )
El constructor de la clase hija tiene que invocar
al de la clase padre utilizando la palabra clave
base.
Si no invoca al constructor del padre, el
compilador añade base().
La llamada al constructor se realiza justo
después de la lista de parámetros ( = C++)
Tema 3
Herencia
4
Redefinición de métodos
Un método o propiedad sólo puede ser
redefinido si se declara con el modificador
virtual ( = C++)
Para redefinir un método en una subclase hay
que utilizar el modificador override.
En un refinamiento, se llama a la versión del
padre con base ( = super de Java)
Tema 3
Herencia
5
Redefinición de métodos
Si se define un método con la misma
declaración que otro método virtual de la
clase padre, podemos indicar que no lo
redefinimos con el modificador new:
Se entiende que se define un método con la misma
signatura, pero con distinto significado.
No se aplicaría ligadura dinámica.
Tema 3
Herencia
6
Depósito 1/2
public class Deposito
{
public Persona Titular { get; private set; }
public virtual double Capital { get; protected set; }
public int PlazoDias { get; private set; }
public double TipoInteres { get; private set; }
public Deposito(Persona titular, double capital,
int plazoDias, double tipoInteres) {
Titular = titular; Capital = capital;
PlazoDias = plazoDias; TipoInteres = tipoInteres;
}
…
Tema 3
Herencia
7
Depósito 2/2
public class Deposito
{ …
public virtual double Intereses
{
get
{
}
}
public double Liquidar()
{
}
return Capital + Intereses;
return (PlazoDias * TipoInteres * Capital) / 365;
}
Tema 3
Herencia
8
Depósito Penalizable 1/2
public class DepositoPenalizable : Deposito
{
public bool Penalizado { get; set; }
public override double Intereses
{
get
{
}
}
…
if (Penalizado)
else return Intereses;
return base.Intereses / 2;
Tema 3
Herencia
9
Depósito Penalizable 2/2
public class DepositoPenalizable : Deposito
{ …
public DepositoPenalizable(Persona titular, double capital,
int plazoDias, double tipoInteres):
base(titular, capital, plazoDias, tipoInteres)
{
}
}
Penalizado = false;
Tema 3
Herencia
10
Redefinición y visibilidad
Si el método redefinido es virtual:
No se puede modificar su nivel de visibilidad (distinto
a Java y C++)
Si el método no es virtual (no se redefine):
Podemos cambiar la visibilidad, aumentarla o
reducirla.
Tema 3
Herencia
11
Restringir la herencia
Al redefinir un método virtual, podemos
indicar que no se pueda redefinir en los
subtipos con el modificador sealed (= final
de Java)
Ejemplo:
Podríamos definir como sealed la redefinición de
Intereses/get en DepositoEstructurado.
Impediría que DepositoGarantizado pudiera
cambiar la implementación.
Una clase se puede definir como sealed
indicando que no se puede heredar de ella (=
final de Java)
Tema 3
Herencia
12
Polimorfismo y ligadura
El polimorfismo está permitido sólo para
entidades de tipos referencia (clases,
interfaces).
La ligadura dinámica sólo se aplica en tipos
referencia y en métodos declarados con el
modificador virtual ( = C++)
Se aplica la versión del tipo dinámico, si la clase del
objeto ha redefinido el método con override.
La ligadura estática se aplica en el resto de
casos.
Tema 3
Herencia
13
Clase object
La clase object representa la raíz de la
jerarquía de tipos en C# y .NET
Define métodos básicos para la plataforma:
public virtual bool Equals(object otro)
public static bool ReferenceEquals
(object obj1, object obj2)
Comprueba siempre la identidad de objetos referencia y es
aplicable a referencias nulas.
Tema 3
Herencia
14
Clase object
Métodos básicos:
public virtual String ToString()
public Type GetType()
Equivalente al getClass() de Java.
Para preguntar por el tipo de una variable se utiliza
typeof(var).
public virtual int GetHashCode()
protected object MemberwiseClone()
Realiza una copia superficial del objeto receptor de la
llamada.
Tema 3
Herencia
15
Casting
Se puede aplicar un casting entre tipos
compatibles:
estructurado = (DepositoEstructurado)deposito;
Sin embargo, para los tipos referencia se define
el operador as.
estructurado = deposito as DepositoEstructurado;
Devuelve null si la conversión no es correcta.
Similar al dynamic_cast de C++.
Tema 3
Herencia
16
Compatibilidad de tipos
Se define el operador is para consultar la
compatibilidad de tipos (= instanceof de
Java):
if (deposito is DepositoEstructurado)
{
// El casting va a ser correcto
estructurado = (DepositoEstructurado)deposito;
}
Tema 3
Herencia
17
Clases abstractas
Las clases pueden declararse como abstractas utilizando
el modificador abstract .
Métodos y propiedades se declaran abstractos con
abstract.
Si una subclase no implementa una declaración
abstracta, debe declararse como abstracta.
Una clase abstracta define un tipo, pero no se pueden
construir objetos.
Una clase es abstracta si define un concepto
abstracto del cual no está permitido crear objetos.
Tema 3
Herencia
18
Clases abstractas
public abstract class ProductoFinanciero
{
Titular = titular;
public Persona Titular { get; private set; }
public ProductoFinanciero(Persona titular) {
}
public abstract double Beneficio { get; }
public double Impuestos {
get {
}
return Beneficio * 0.18;
}
}
Tema 3
Herencia
19
Interfaces
C# define el concepto de interfaz similar al de
Java.
Permite definir propiedades y métodos, pero
no constantes.
Una clase puede implementar múltiples
interfaces.
Una interfaz puede extender varias interfaces.
Los miembros de una interfaz siempre son
públicos.
Tema 3
Herencia
20
Interfaces – Declaración
Declaración de una interfaz:
public interface Amortizable
{
}
bool Amortizar(double cantidad);
Una interfaz puede extender múltiples
interfaces:
public interface Flexible : Amortizable, Incrementable
{
}
void ActualizarTipoInteres(double tipo);
Tema 3
Herencia
21
Interfaces – Implementación
public class DepositoPenalizable : Deposito , Amortizable
{
…
public bool Amortizar(double cantidad)
{
if (cantidad > Capital)
return false;
Capital = Capital - cantidad;
return true;
}
}
Tema 3
Herencia
22
Interfaces – Métodos repetidos
Dos interfaces puede definir métodos o
propiedades con la misma signatura ( métodos
repetidos )
Si una clase implementa las dos interfaces con
métodos repetidos, sólo podremos proporcionar
una única implementación para esos
métodos
El mismo problema existe en Java.
En cambio, en C# podemos resolverlo mediante
la implementación explícita de interfaces.
Tema 3
Herencia
23
Interfaces -Implementación explícita
Implementación explícita de una interfaz:
El nombre del método va acompañado del nombre
de la interfaz.
No se declara visibilidad. Se asume pública.
public class DepositoPenalizable : Deposito, Amortizable
{
…
bool Amortizable.Amortizar(double cantidad)
{ … }
}
Tema 3
Herencia
24
Interfaces -Implementación explícita
La implementación explícita de interfaces tiene
las siguientes limitaciones:
El método no puede ser utilizado dentro de la clase.
El método no puede ser aplicado sobre variables del
tipo de la clase (en el ejemplo,
DepositoPenalizable).
El método sólo puede ser aplicable sobre variables
polimórficas del tipo de la interfaz:
DepositoPenalizable penalizable = new …;
penalizable.Amortizar(100); // error
Amortizable amortizable = penalizable;
amortizable.Amortizar(100);
Tema 3
Herencia
25
Interfaces y estructuras
Las estructuras pueden implementar interfaces.
void reset();
public interface Reseteable
{
}
public struct Punto: Reseteable
{ …
// Método Interfaz Reseteable
public void reset()
{
x = 0;
y = 0;
}
}
Tema 3
Herencia
26
Interfaces y estructuras
Asignación a una interfaz:
Punto punto = new Punto(2, 3);;
Reseteable res = punto;
res.reset();
Punto otro = (Punto) res;
Console.WriteLine("Punto X: " + otro.X); // 0
Una interfaz es un tipo referencia, ¿cómo
puede apuntar a un tipo con semántica valor?
Boxing
Tema 3
Herencia
27
Boxing y unboxing
Boxing: representación de tipos por valor
como objetos por referencia.
Unboxing realiza el proceso contrario.
Con los tipos primitivos también se aplica el
mecanismo de boxing:
int
Comentarios de: Tema 3: Herencia en C# (0)
No hay comentarios