Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Herencia
Herencia
Concepto de herencia
Clases abstractas
Clases selladas
Tipos anidados
Operadores especiales
Concepto de herencia
El mecanismo de herencia es uno de los pilares fundamentales en los que se basa
la programacin orientada a objetos. Es un mecanismo que permite definir nuevas
clases a partir de otras ya definidas. Si en la definicin de una clase indicamos que
sta deriva de otra, entonces la primera -a la que se le suele llamar clase hija o
clase derivada- ser tratada por el compilador automticamente como si su
definicin incluyese la definicin de la segunda -a la que se le suele llamar clase
padre o clase base.
Herencia de constructores
Los objetos de una clase derivada contarn con los mismos miembros que los
objetos de la clase base y adems incorporarn nuevos campos y/o mtodos. El
constructor de una clase derivada puede emplear el constructor de la clase base
para inicializar los campos heredados de la clase padre con la construccin base . En
realidad se trata de una llamada al constructor de la clase base con los parmetros
adecuados.
: base(<parametrosBase>)
using System;
namespace DemoHerencia {
class CocheSimple
{
private int VelocMax;
private string Marca;
private string Modelo;
public CocheSimple () {
this.VelocMax = 0;
this.Marca = "??";
this.Modelo = "??";
}
public CocheSimple (string marca, string mod, int
velMax)
{
this.VelocMax = velMax;
this.Marca = marca;
this.Modelo = mod;
}
public void MuestraCoche () {
Console.WriteLine (this.Marca + " " +
this.Modelo +
"
Km/h)");
}
} // class CocheSimple
class Taxi : CocheSimple
private string CodLicencia;
vel)
public Taxi () {}
public Taxi (string marca, string mod, int vel,
string lic) : base (marca, mod,
{
this.CodLicencia = lic;
}
public string Licencia {
get { return this.CodLicencia; }
}
} // class Taxi
class DemoHerenciaApp {
static void Main(string[] args) {
CocheSimple MiCoche =
new CocheSimple ("Citren", "Xsara
Picasso", 220);
CocheSimple TuCoche =
new CocheSimple ("Opel", "Corsa", 190);
CocheSimple UnCoche = new CocheSimple ();
Console.Write ("Mi coche: ");
MiCoche.MuestraCoche();
Console.Write ("El tuyo: ");
TuCoche.MuestraCoche();
Console.Write ("Un coche sin identificar: ");
UnCoche.MuestraCoche();
Console.WriteLine();
Taxi ElTaxiDesconocido = new Taxi ();
Console.Write ("Un taxi sin identificar: ");
ElTaxiDesconocido.MuestraCoche();
Taxi NuevoTaxi= new Taxi ("Ford", "KA", 150,
"GR1234");
Console.Write ("Un taxi nuevo: ");
NuevoTaxi.MuestraCoche();
Console.Write ("
Licencia: {0}",
NuevoTaxi.Licencia);
Console.ReadLine ();
} // Main
} // class DemoHerenciaApp
} // namespace DemoHerencia
Redefinicin de mtodos
Siempre que se redefine un mtodo que aparece en la clase base, hay que utilizar
explcitamente la palabra reservada override y, de esta forma, se evitan
redefiniciones accidentales (una fuente de errores en lenguajes como Java o C++).
Sabemos que todos los objetos (incluidas las variables de los tipos predefinidos)
derivan, en ltima instancia, de la clase Object. Esta clase proporciona el mtodo
ToString que crea una cadena de texto legible para el usuario que describe una
instancia de la clase. Si dejamos sin redefinir este mtodo y empleando la clase
CocheSimple las siguientes instrucciones:
CocheSimple MiCoche =
new CocheSimple ("Citren", "Xsara Picasso",
220);
Console.WriteLine ("Mi coche: " +
MiCoche.ToString());
Mi coche: DemoHerencia.CocheSimple
class CocheSimple
{
...
public override string ToString()
{
return (this.Marca + " " + this.Modelo +
" (" + this.VelocMax + " Km/h)");
}
...
}
La palabra reservada base sirve para hacer referencia a los miembros de la clase
base que quedan ocultos por otros miembros de la clase actual. Por ejemplo,
podramos redefinir tambin el mtodo ToString de la clase Taxi empleando el
mtodo redefinido ToString de la clase base CocheSencillo:
class CocheSimple
{
...
public override string ToString()
{
return (this.Marca + " " + this.Modelo +
" (" + this.VelocMax + " Km/h)");
}
...
}
class Taxi : CocheSimple
{
...
public override string ToString()
{
return (base.ToString() + "\n
Licencia: " +
this.Licencia);
}
...
}
......
Taxi ElTaxiDesconocido = new Taxi ();
Console.WriteLine ("Un taxi sin identificar: " +
ElTaxiDesconocido);
Taxi NuevoTaxi= new Taxi ("Citren", "C5", 250,
"GR1234");
Console.WriteLine ("Un taxi nuevo: " + NuevoTaxi);
......
y el resultado es:
Mtodos virtuales
Un mtodo es virtual si puede redefinirse en una clase derivada. Los mtodos son
no virtuales por defecto.
Los mtodos no virtuales no son polimrficos (no pueden
reemplazarse) ni pueden ser abstractos.
Los mtodos virtuales se definen en una clase base (empleando la
palabra reservada virtual) y pueden ser reemplazados
(empleando la palabra reservada override) en las subclases
(stas proporcionan su propia -especfica- implementacin).
Generalmente, contendrn una implementacin por defecto del
mtodo (si no, se deberan utilizar mtodos abstractos).
HandleShape(new Box());
HandleShape(new Sphere());
HandleShape(new Shape());
NOTA: Propiedades, indexadores y eventos tambin pueden ser virtuales.
Clases abstractas
Una clase abstracta es una clase que no puede ser instanciada. Se declara
empelando la palabra reservada abstract.
Permiten incluir mtodos abstractos y mtodos no abstractos cuya implementacin
hace que sirvan de clases base (herencia de implementacin). Como es lgico, no
pueden estar "selladas".
Mtodos abstractos
Un mtodo abstracto es un mtodo sin implementacin que debe pertenecer a una clase
abstracta. Lgicamente se trata de un mtodo virtual forzoso y su implementacin se
realizar en una clase derivada.
Clases selladas
// Error !!!
Una clase sellada (sealed), es una clase de la que no pueden derivarse otras
clases (esto es, no puede utilizarse como clase base). Obviamente, no puede ser
una clase abstracta.
Los struct en C# son implcitamente clases selladas.
Para qu sirve sellar clases? Para evitar que se puedan crear subclases y optimizar
el cdigo (ya que las llamadas a las funciones de una clase sellada pueden
resolverse en tiempo de compilacin).
Tipos anidados
C# permite declarar tipos anidados, esto es, tipos definidos en el mbito de otro
tipo. El anidamiento nos permite que el tipo anidado pueda acceder a todos los
miembros del tipo que lo engloba (independientemente de los modificadores de
acceso) y que el tipo est oculto de cara al exterior (salvo que queramos que sea
visible, en cuyo caso habr que especificar el nombre del tipo que lo engloba para
poder acceder a l).
Operadores especiales
is
Se utiliza para comprobar dinmicamente si el tipo de un objeto es compatible con
un tipo especificado (instanceof en Java).
No conviene abusar de este operador (es preferible disear correctamente una jerarqua
de tipos).
as
Intenta convertir de tipo una variable (al estilo de los casts dinmicos de C++). Si
la conversin de tipo no es posible, el resultado es null. Es ms eficiente que el
operador is, si bien tampoco es conveniente abusar del operador as.
typeof
El operador typeof devuelve el objeto derivado de System.Type correspondiente al
tipo especificado. De esta forma se puede hacer reflexin para obtener
...
Console.WriteLine(typeof(int).FullName);
Console.WriteLine(typeof(System.Int).Name);
Console.WriteLine(typeof(float).Module);
Console.WriteLine(typeof(double).IsPublic);
Console.WriteLine(typeof(Point).MemberType);
...