La herencia
La herencia de clases
Como se ha visto anteriormente, todas las clases del Framework .NET provienen de la clase System.Object. La herencia se puede poner en práctica de dos maneras, la herencia de clases y la herencia de interfaces.
La herencia implica que un tipo derive de un tipo base, haciendo accesibles todos sus miembros. La herencia es útil cuando tenga que añadir funcionalidades a un tipo existente, o cuando varios tipos comparten las mismas funcionalidades.
1. Implementar la herencia
La declaración de la herencia utiliza una sintaxis sencilla. Es suficiente con añadir el nombre del tipo base tras el nombre de la clase derivada y el carácter :. Una clase solo puede derivar de un único tipo base.
El mejor ejemplo es el formulario Form1.cs.
Abra el archivo en el editor de texto y observe la declaración de la clase:
public partial class Form1: Form
La clase Form1 deriva de la clase base Form, por lo que Form1 contiene todos los miembros accesibles de su clase base. IntelliSense permite encontrarlas con facilidad:
Si no se especifica ninguna clase base, el compilador considera que System.Object es la clase base. De esta manera, los dos ejemplos siguientes son idénticos:
public class Project: System.Object // Herencia explícita
{
}
public class Project // Herencia implícita
{
}
Por simplicidad, la herencia de la clase Object nunca se marca explícitamente en la definición de una clase.
Los miembros que son accesibles desde la clase derivada son aquellos que tienen un nivel de acceso public, protected o internal. Los miembros privados (private) no serán visibles por la clase heredada.
2. Los miembros virtuales
Declarando un miembro de la clase base con la palabra clave virtual se autoriza al miembro a ser sobrecargado por las clases derivadas. Esto se aplica a los métodos y a las propiedades:
public class ClaseDeBase
{
public virtual bool PropiedadDeBase { get; set; }
public virtual void MetodoDeBase()
{
}
}
Cuando un método virtual se sobrecarga en una clase derivada, la llamada al método implica la ejecución...
Las interfaces
Las interfaces van a permitir definir los comportamientos para las clases que las implementan. Las clases que implementan la misma interfaz serán capaces de interactuar de manera polimórfica. De ello resulta que cualquier tipo que implemente una interfaz, proporciona obligatoriamente una implementación de los miembros definidos en esta interfaz.
La interfaz solo define los miembros que un tipo deberá implementar, de la misma manera que una clase abstracta (con la diferencia de que los tipos no derivan de esta clase abstracta y, por tanto, podrán ser totalmente independientes los unos de los otros). Por el contrario, como sucede con las clases abstractas, no se puede instanciar una interfaz.
1. La implementación de interfaces
La sintaxis de declaración de una interfaz es parecida a la declaración de una clase, usando la palabra clave interface.
En el proyecto SelfMailer, cree un nuevo elemento en la carpeta Library ([Ctrl][Mayús] A cuando se seleccione la carpeta). En la ventana Añadir un nuevo elemento, seleccione Interfaz y llame al archivo IReportChange.cs. Por convención, los nombres de las interfaces comienzan tradicionalmente por la letra i mayúscula, de manera que se puedan identificar con más facilidad en el código. Pero nada impide definir un nombre que no empiece por este carácter.
Esta interfaz se implementará en las clases del proyecto con el objetivo de que las clases implementen un sistema de informe de cambios. La interfaz se presenta de la siguiente manera:
interface IReportChange
{
}
Defina los miembros de la interfaz:
interface IReportChange
{
bool HasChanged
{ ...