PDF de programación - Tema 3: Herencia en C#

Imágen de pdf Tema 3: Herencia en C#

Tema 3: Herencia en C#gráfica de visualizaciones

Publicado el 24 de Enero del 2017
2.495 visualizaciones desde el 24 de Enero del 2017
172,3 KB
57 paginas
Creado hace 12a (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
  • Links de descarga
http://lwp-l.com/pdf2099

Comentarios de: Tema 3: Herencia en C# (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad