Ya hemos visto en Hablemos de Herencia, los conceptos básicos de este tema.
Analicemos entonces como queda el código de lo ya definido, y algunas variantes al respecto.
Ser vivo.
Por recordar, esta era su representación gráfica.
Y así quedaría el código:
Public MustInherit Class SerVivo Public Sub Nacer() End Sub Public Sub Crecer() End Sub Public Sub Reproducir() End Sub Public Sub Morir() End Sub Public MustOverride Sub GenerarEnergía() End Class
public abstract class SerVivo { public void Nacer() { } public void Crecer() { } public void Reproducir() { } public void Morir() { } public abstract void GenerarEnergía(); }
Como vemos, la clase se declara como que debe heredarse (MustInherit en VB, abstract en C#), y luego se definen los distintos métodos.
El método que debe codificarse en las clases derivadas, se declara como MustOverride (VB), abstract (C#).
Presta atención que, en C#, el mismo término significa cosas distintas, dependiendo del entorno. No es muy común, pero a veces pasa.
En ambos casos, los métodos que deben codificarse en los descendientes, no tienen cuerpo (No hay End Sub en VB, ni llaves en C#, donde termina con punto y coma).
Las clases derivadas.
Public Class Vegetal Inherits SerVivo Public Overrides Sub GenerarEnergía() Fotosíntesis() End Sub Private Sub Fotosíntesis() End Sub End Class
public class Vegetal : SerVivo { public override void GenerarEnergía() { Fotosíntesis(); } private void Fotosíntesis() { } }
Como vemos, ese método “no implementado” en la clase base, se debe terminar de definir en las clases derivadas (“sobre escribirse”).
En ambos lenguajes, la definición es casi idéntica.
En Visual Studio, al definir que una clase hereda de otra, el entorno te indica “como error” que deben escribirse esos métodos y hasta se ofrece a generarte el esquema base
Se indica que una clase hereda por distintos mecanismos, según el idioma.
En Visual Basic, se declara taxativamente que hereda “Inherits” de otra clase.
En C#, ese concepto se “entiende” porque luego de la declaración de la clase, se sigue con dos puntos, y el nombre de la clase que se hereda.
A partir de aquí, se podrá seguir heredando para cubrir, progresivamente, mayores especializaciones y características.
Lo interesante, es que cualquier modificación de una clase base, se reflejará (en realidad, se “heredará”), en cualquiera de sus derivadas.
Esto de la herencia, en definitiva, nos permite “comprometer” que nuestro código se vea siempre de la misma forma, en todas las clases derivadas/heredadas. Aún cuando una clase heredada presente más miembros, si la “vemos” como una clase base, siempre encontraremos los mismos métodos.
Pero hay otra forma de “comprometer” tu código para cumplir un convenio.
Eso es tema de la siguiente publicación.