Herencia (Informática)
|
Herencia. Es una propiedad que permite que los objetos sean creados a partir de otros ya existentes, obteniendo características (métodos y atributos) similares a los ya existentes.
Qué es Herencia
Es la relación entre una clase general y otra clase mas especifica. Es un mecanismo que nos permite crear clases derivadas a partir de clase base, nos permite compartir automáticamente métodos y datos entre clases subclases y objetos. Por ejemplo: Si declaramos una clase párrafo derivada de un clase texto todos los métodos y variables asociadas con la clase texto son automáticamente heredados por la subclase párrafo. La herencia, junto con la encapsulación y el polimorfismo, es una de las tres características principales (o "pilares") de la programación orientada a objetos. La herencia permite crear nuevas clases que reutilizan, extienden y modifican el comportamiento que se define en otras clases. La clase cuyos miembros se heredan se denomina clase base y la clase que hereda esos miembros se denomina clase derivada.
Tipos de Herencia
- Herencia Simple: Indica que se pueden definir nuevas clases solamente a partir de una clase inicial
- Herencia Multiple: Indica que se pueden definir nuevas clases a partir de dos o más clases iniciales.
- Herencia de implementación: La implementación de los métodos es heredada. Puede sobreescribirse en las clases derivadas.
- Herencia de interfaz: Sólo se hereda la interfaz, no hay implementación a nivel de clase base (interfaces en Java, clases abstractas en C++)
Ejemplo
En el ejemplo siguiente se muestra cómo se expresan en C# las relaciones de clase presentadas en la ilustración anterior. En el ejemplo también se muestra cómo WorkItem invalida el método virtual Object.ToString y cómo la clase ChangeRequest hereda la implementación de WorkItem del método. // WorkItem implicitly inherits from Object class public class WorkItem {
private static int nextID; protected int ID { get; set; } protected TimeSpan jobLength { get; set; } protected string Title { get; set; } protected string Description { get; set; } // Default constructor public WorkItem() { ID = 0; Title = "Default title"; Description = "Default description."; jobLength = new TimeSpan(); } // Static constructor for static member. static WorkItem() { nextID = 0; } // Instance constructor. public WorkItem( string title, string desc, TimeSpan joblen) { this.ID = GetNextID(); this.Title = title; this.Description = desc; this.jobLength = joblen; } protected int GetNextID() { return ++nextID; } public void Update(string title, TimeSpan joblen) { this.Title = title; this.jobLength = joblen; } // Virtual method override. public override string ToString() { return String.Format("{0} - {1}", this.ID, this.Title); }
}
// ChangeRequest derives from WorkItem and adds two of its own members. public class ChangeRequest : WorkItem {
protected int originalItemID {get; set;} public ChangeRequest() { } public ChangeRequest(string title, string desc, TimeSpan jobLen, int originalID) { this.ID = GetNextID(); this.Title = title; this.Description = desc; this.jobLength = jobLen; this.originalItemID = originalID; }
}
class Program {
static void Main() { WorkItem item = new WorkItem( "Fix Bugs", "Fix all bugs in my source code branch", new TimeSpan(3, 4, 0, 0)); ChangeRequest change = new ChangeRequest("Change design of base class", "Add members to base class", new TimeSpan(4, 0, 0), 1); Console.WriteLine(item.ToString()); // ChangeRequest inherits WorkItem's override of ToString Console.WriteLine(change.ToString()); // Keep the console open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); }
}