You are on page 1of 10

Herencia y clases derivadas (C# y Java) Pgina 1 de 10

Herencia y clases derivadas (C# y Java)

Actualizacin: noviembre 2007

La funcionalidad de una clase existente se puede extender al crear una nueva clase que se deriva de ella. La clase
derivada hereda las propiedades de la clase base y es posible agregar o reemplazar mtodos y propiedades segn
sea necesario.

En C#, el operador :, que equivale a extends e implements en Java, define la herencia e implementacin de
interfaces. La clase base siempre debe estar en el extremo izquierdo en la declaracin de clase.

Como Java, C# no admite herencia mltiple, lo que significa que las clases no pueden heredar ms de una clase. Sin
embargo, se pueden utilizar interfaces para ese propsito, de la misma manera que en Java.

El cdigo siguiente define una clase denominada CoOrds con dos variables miembro privadas x e y que representan
la posicin del punto. Se tiene acceso a estas variables mediante propiedades denominadas X e Y, respectivamente:

C#

public class CoOrds


{
private int x, y;

public CoOrds() // constructor


{
x = 0;
y = 0;
}

public int X
{
get { return x; }
set { x = value; }
}

public int Y
{
get { return y; }
set { y = value; }
}
}

Una nueva clase, denominada ColorCoOrds, se deriva de la clase CoOrds del siguiente modo:

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 2 de 10

C#

public class ColorCoOrds : CoOrds

Luego, ColorCoOrds hereda todos los campos y mtodos de la clase base, a la cual se pueden agregar nuevos
campos y mtodos para proporcionar caractersticas adicionales en la clase derivada, segn sea necesario. En este
ejemplo, se agrega un miembro privado y descriptores de acceso para agregar color a la clase:

C#

public class ColorCoOrds : CoOrds


{
private System.Drawing.Color screenColor;

public ColorCoOrds() // constructor


{
screenColor = System.Drawing.Color.Red;
}

public System.Drawing.Color ScreenColor


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

El constructor de la clase derivada llama implcitamente al constructor de la clase base o la superclase, en


terminologa de Java. En caso de herencia, se llama a todos los constructores de clase base antes que a los
constructores de la clase derivada en el orden en que las clases aparecen en la jerarqua de clases.

Convertir un tipo a una clase base


Como en Java, no se puede utilizar una referencia a una clase base para tener acceso a los miembros y mtodos
de una clase derivada, aunque la referencia de la clase base pueda contener una referencia vlida a un objeto del
tipo derivado.

Implcitamente, se puede hacer referencia a una clase derivada con una referencia al tipo derivado:

C#

ColorCoOrds color1 = new ColorCoOrds();


CoOrds coords1 = color1;

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 3 de 10

En este cdigo, la referencia de clase base, coords1, contiene una copia de la referencia color1.

La palabra clave base


Se puede tener acceso a los miembros de clase base en una subclase incluso cuando los miembros de base se
reemplazan en la superclase utilizando la palabra clave base. Por ejemplo, puede crear una clase derivada que
contenga un mtodo con la misma firma que la clase base. Si se precede ese mtodo con la palabra clave new, se
indica que se trata de un mtodo totalmente nuevo que pertenece a la clase derivada. Tambin se podra
proporcionar un mtodo para tener acceso al mtodo original de la clase base con la palabra clave base.

Por ejemplo, supongamos que la clase base CoOrds tuviera un mtodo denominado Invert() que intercambia
las coordenadas x e y. Se podra proporcionar un sustituto para este mtodo en la clase derivada ColorCoOrds
con un cdigo como ste:

C#

public new void Invert()


{
int temp = X;
X = Y;
Y = temp;
screenColor = System.Drawing.Color.Gray;
}

Como se puede observar, este mtodo intercambia x e y, luego establece el color del punto en gris. Se podra
proporcionar acceso a la implementacin base para este mtodo creando otro mtodo en ColorCoOrds, como el
de este ejemplo:

C#

public void BaseInvert()


{
base.Invert();
}

A continuacin, se invoca el mtodo base en un objeto ColorCoOrds mediante una llamada al mtodo
BaseInvert().

C#

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 4 de 10

ColorCoOrds color1 = new ColorCoOrds();


color1.BaseInvert();

Recuerde que se obtendra el mismo efecto si se asignara una referencia de la clase base a una instancia de
ColorCoOrds y, a continuacin, se tuviera acceso a sus mtodos:

C#

CoOrds coords1 = color1;


coords1.Invert();

Seleccionar los constructores


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 ms de un
constructor, la clase derivada puede decidir a qu constructor se va a llamar. Por ejemplo, podra modificar la clase
CoOrds para agregar un segundo constructor, del siguiente modo:

C#

public class CoOrds


{
private int x, y;

public CoOrds()
{
x = 0;
y = 0;
}

public CoOrds(int x, int y)


{
this.x = x;
this.y = y;
}
}

Luego, podra cambiar la clase ColorCoOrds para utilizar uno de los constructores disponibles mediante la palabra
clave base:

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 5 de 10

C#
public class ColorCoOrds : CoOrds
{
public System.Drawing.Color color;

public ColorCoOrds() : base ()


{
color = System.Drawing.Color.Red;
}

public ColorCoOrds(int x, int y) : base (x, y)


{
color = System.Drawing.Color.Red;
}
}

En Java, esta funcionalidad se implementa con la palabra clave super.

Reemplazar el mtodo
Una clase derivada puede reemplazar el mtodo de una clase base si se proporciona una nueva implementacin
del mtodo declarado. Una diferencia importante entre Java y C# es que, de forma predeterminada, los mtodos
de Java se marcan como virtuales, mientras que en C# los mtodos se deben marcar explcitamente como virtuales
con el modificador virtual. Los descriptores de acceso de propiedades, as como los mtodos, se pueden
reemplazar de manera muy similar.

Mtodos virtuales
Un mtodo que ser reemplazado en una clase derivada se declara con el modificador virtual. En una clase
derivada, el mtodo reemplazado se declara con el modificador override.

El modificador override denota un mtodo o propiedad de una clase derivada que reemplaza un mtodo o
propiedad con el mismo nombre y firma en la clase base. El mtodo base, que ser reemplazado, se debe declarar
como virtual, abstract u override: no es posible reemplazar un mtodo no virtual o esttico de esta forma. El
mtodo o la propiedad reemplazados y aquellos que se reemplazan deben tener los mismos modificadores de
nivel de acceso.

El ejemplo siguiente muestra un mtodo virtual denominado StepUp que es reemplazado en una clase derivada
con el modificador que lo reemplaza:

C#

public class CountClass


{

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 6 de 10

public int count;

public CountClass(int startValue) // constructor


{
count = startValue;
}

public virtual int StepUp()


{
return ++count;
}
}

class Count100Class : CountClass


{
public Count100Class(int x) : base(x) // constructor
{
}

public override int StepUp()


{
return ((base.count) + 100);
}
}

class TestCounters
{
static void Main()
{
CountClass counter1 = new CountClass(1);
CountClass counter100 = new Count100Class(1);

System.Console.WriteLine("Count in base class = {0}", counter1.StepUp());


System.Console.WriteLine("Count in derived class = {0}", counter100.StepUp());
}
}


Cuando se ejecuta este cdigo, se observa que el constructor de la clase derivada utiliza el cuerpo del mtodo
proporcionado en la clase base, lo que permite inicializar el recuento de miembros sin duplicar el cdigo. ste es
el resultado:

Count in base class = 2

Count in derived class = 101

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 7 de 10

Clases abstractas
Una clase abstracta declara uno o ms mtodos o propiedades como abstractos. La clase que declara dichos
mtodos no les proporciona una implementacin, aunque una clase abstracta tambin puede contener mtodos
no abstractos, es decir, mtodos para los que se ha proporcionado una implementacin. No se puede crear
directamente una instancia de una clase abstracta; slo se puede crear una instancia de una clase derivada. Estas
clases derivadas deben proporcionar implementaciones para todos los mtodos y propiedades abstractos,
mediante la palabra clave override, a menos que el miembro derivado se declare abstracto.

El ejemplo siguiente declara una clase abstracta Employee. Tambin se crea una clase derivada denominada
Manager, que proporciona una implementacin del mtodo abstracto Show() definido en la clase Employee:

C#

public abstract class Employee


{
protected string name;

public Employee(string name) // constructor


{
this.name = name;
}

public abstract void Show(); // abstract show method


}

public class Manager: Employee


{
public Manager(string name) : base(name) {} // constructor

public override void Show() //override the abstract show method


{
System.Console.WriteLine("Name : " + name);
}
}

class TestEmployeeAndManager
{
static void Main()
{
// Create an instance of Manager and assign it to a Manager reference:
Manager m1 = new Manager("H. Ackerman");
m1.Show();

// Create an instance of Manager and assign it to an Employee reference:


Employee ee1 = new Manager("M. Knott");
ee1.Show(); //call the show method of the Manager class
}
}

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 8 de 10

Este cdigo invoca la implementacin del mtodo Show() proporcionado por la clase Manager e imprime el
nombre del empleado en pantalla. ste es el resultado:

Name : H. Ackerman

Name : M. Knott

Interfaces
Una interfaz es un tipo de clase esqueleto que contiene firmas de mtodo pero no incluye ninguna
implementacin de mtodo. De esta manera, las interfaces son como clases abstractas que contienen slo
mtodos abstractos. Las interfaces de C# son muy similares a las de Java y funcionan de manera muy similar.

Todos los miembros de una interfaz son pblicos por definicin y una interfaz no puede contener constantes,
campos (miembros de datos privados), constructores, destructores ni ningn tipo de miembro esttico. El
compilador generar un error si se especifica un modificador para los miembros de una interfaz.

Las clases se pueden derivar de una interfaz para implementar esa interfaz. Estas clases derivadas deben
proporcionar implementaciones para todos los mtodos de la interfaz, a menos que la clase derivada se declare
abstracta.

Una interfaz se declara de forma idntica en Java. En una definicin de interfaz, una propiedad indica slo su tipo
y si es de slo lectura, slo escritura o de lectura y escritura nicamente por medio de las palabras clave get y set.
La interfaz siguiente declara una propiedad de slo lectura:

C#

public interface ICDPlayer


{
void Play(); // method signature
void Stop(); // method signature

int FastForward(float numberOfSeconds);

int CurrentTrack // read-only property


{
get;
}
}

Una clase se puede heredar de esta interfaz utilizando dos puntos, en lugar de la palabra clave implements de
Java. La clase que se implementa debe proporcionar definiciones para todos los mtodos y cualquier descriptor de
acceso de la propiedad necesario, del siguiente modo:

C#

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 9 de 10

public class CDPlayer : ICDPlayer


{
private int currentTrack = 0;

// implement methods defined in the interface


public void Play()
{
// code to start CD...
}

public void Stop()


{
// code to stop CD...
}

public int FastForward(float numberOfSeconds)


{
// code to fast forward CD using numberOfSeconds...

return 0; //return success code


}

public int CurrentTrack // read-only property


{
get
{
return currentTrack;
}
}

// Add additional methods if required...


}

Implementar mltiples interfaces


Una clase puede implementar mltiples interfaces mediante la sintaxis siguiente:

C#

public class CDAndDVDComboPlayer : ICDPlayer, IDVDPlayer

Si una clase implementa ms de una interfaz donde hay ambigedad en los nombres de los miembros, se resuelve
utilizando el calificador completo del nombre de la propiedad o mtodo. Es decir, la clase derivada puede resolver
el conflicto si se utiliza el nombre completo del mtodo para indicar a qu interfaz pertenece, como en
ICDPlayer.Play().

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016
Herencia y clases derivadas (C# y Java) Pgina 10 de 10

Vea tambin
Conceptos
Gua de programacin de C#
Referencia
Herencia (Gua de programacin de C#)
Otros recursos
Lenguaje de programacin C# para desarrolladores de Java

Adiciones de comunidad

2016 Microsoft

https://msdn.microsoft.com/es-pe/library/ms228387(v=vs.90).aspx 25/01/2016

You might also like