Академический Документы
Профессиональный Документы
Культура Документы
Como se ha visto anteriormente, todas las clases del Framework .NET provienen de la clase System.Object.La
herenciasepuedeponerenprcticadedosmaneras,laherenciadeclasesylaherenciadeinterfaces.
Laherenciaimplicaqueuntipoderivedeuntipobase,haciendoaccesiblestodossusmiembros.Laherenciaestil
cuando tenga que aadir funcionalidades a un tipo existente, o cuando varios tipos comparten las mismas
funcionalidades.
1.Implementarlaherencia
La declaracin de la herencia utiliza una sintaxis sencilla. Es suficiente con aadir el nombre del tipo base tras el
nombredelaclasederivadayelcarcter:.Unaclasesolopuedederivardeunnicotipobase.
ElmejorejemploeselformularioForm1.cs.
Abraelarchivoeneleditordetextoyobserveladeclaracindelaclase:
La clase Form1 deriva de la clase base Form, por lo que Form1 contiene todos los miembros accesibles de su
clasebase.IntelliSensepermiteencontrarlasconfacilidad:
Si no se especifica ninguna clase base, el compilador considera que System.Object es la clase base. De esta
manera,losdosejemplossiguientessonidnticos:
// Herencia explcita
{
}
public class Project
// Herencia implcita
{
}
Porsimplicidad,laherenciadelaclaseObjectnuncasemarcaexplcitamenteenladefinicindeunaclase.
Los miembros que son accesibles desde la clase derivada son aquellos que tienen un nivel de acceso public,
protectedointernal.Losmiembrosprivados(private)nosernvisiblesporlaclaseheredada.
Editions ENI Tous droits rservs Copie personnelle de Jose Antonio Espino Lopez
- 1-
2.Losmiembrosvirtuales
Declarando un miembro de la clase base con la palabra reservada
sobrecargadoporlasclasesderivadas.Estoseaplicaalosmtodosyalaspropiedades:
Cuando un mtodo virtual se sobrecarga en una clase derivada, la llamada al mtodo implica la ejecucin del
mtodosobrecargado,yelmtodobasenosellamar.Elmtodosobrecargadosedebedeclararexplcitamente,
usandolapalabrareservadaoverride:
La declaracin del mtodo derivado debe corresponder con la declaracin del mtodo base. En caso contrario el
compilador devolver un error, ya que ver un mtodo con la palabra reservada override, pero no encontrar
ningnmtodocorrespondienteenlaclasebase.
3.Ocultarlosmiembrosheredados
Siunmtododelaclasehijatienelamismadeclaracinqueunmtododelaclasebaseynosedeclaranniconla
palabrareservadavirtual,nioverride,decimosqueelmtodohijoocultaalmtodobase:
- 2-
Editions ENI Tous droits rservs Copie personnelle de Jose Antonio Espino Lopez
Durante la compilacin, se da una advertencia que indica al desarrollador que el mtodo oculta el miembro de la
clasebase.Estaadvertenciapermiteclarificarelhechodequeelmtodobasenosellamaryquesisehahecho
demaneraintencionada,hayqueaadirlapalabrareservadanewalmtodohijo:
Laadvertenciatambinsedesencadenasielmtodobasesemarcacomovirtual,peroelcompiladorsugiereaadir
lapalabrareservadaoverrideenlugardenew.
4.Lapalabrareservadabase
Cuandounmiembrosesobrecarga,elmiembrobaseyanoesaccesibledesdeunainstanciadelaclase,perosigue
siendoaccesibledesdelaclaseheredada,graciasalasintaxisbase.[MetodoDeBase]():
Puede utilizar esta sintaxis para llamar a cualquier miembro de la clase base en cualquier regin de cdigo de la
clasehija.
5.Lasclasesymiembrosabstractos
El lenguaje C# autoriza a las clases y miembros a ser marcados con la palabra reservada abstract. Una clase
abstracta no se puede instanciar y un mtodo abstracto no contiene implementacin, solo su declaracin. Esto
implica que una clase abstracta solo se puede usar en el marco de la herencia y que la clase derivada debe
implementarlasfuncionalidadesdelosmiembros:
Una clase abstracta tiene como objetivo definir la forma de las clases hijas sin tener que definir el fondo. La
implementacinfinalesresponsabilidaddelaclasehija.
Apartirdelmomentoenelqueunaclasecontieneunmiembroabstracto,statambinseconvierteenabstractay
sedebemarcarcomotal,conlapalabrareservada abstract.Sinembargo,unaclaseabstractapuedecontener
miembrosnoabstractosqueimplementansupropialgica.Estosmiembrosnoabstractostambinpuedenmarcarse
comovirtualesparapodersobrecargarlosacontinuacin.
Editions ENI Tous droits rservs Copie personnelle de Jose Antonio Espino Lopez
- 3-
La clase que hereda de una clase abstracta, debe implementar todos los miembros abstractos con la palabra
reservadaoverride:
Tambinesposiblecrearunaclasehijaabstractaquederivedeunaclaseabstracta.Entalcaso,noesnecesario
implementartodoslosmiembrosdelaclasepadre:
6.Lasclasesylosmtodoscerrados
Lapalabrareservadasealedenunadeclaracindeclasepermiteprohibirqueotraclaselaherede.Pordefinicin,
una clase cerrada nunca podr ser abstracta, ya que esos dos modificadores son naturalmente opuestos. De la
mismamanera,losmiembrosnopuedenservirtualesnitenerelmodificadordeaccesoprotected:
Una clase no puede ser cerrada y contener miembros que lo sean. Estos miembros, por tanto, no podrn ser
sobrecargadosporlasclaseshijas.Paraasignarelmodificadorsealedaunmiembro,debeheredardeunaclase
base:
- 4-
Editions ENI Tous droits rservs Copie personnelle de Jose Antonio Espino Lopez
}
public class ClaseHija: ClaseDeBase
{
public sealed override void MetodoDeBase()
{ }
}
public class ClaseHija2: ClaseHija
{
public override void MetodoDeBase() // No autorizado
{ }
}
Estopermitedetenerlaherenciadelmiembroyprevenircualquiersobrecargaapartirdelasclaseshijas,aunque
siempreesposiblerealizarunasobrecargaconlapalabrareservadanew:
7.Losconstructoresderivados
Una clase hija debe implementar sus propios constructores. Los constructores de la clase base no estn
directamente accesibles fuera de la clase hija. Los constructores predeterminados (sin parmetro) siempre estn
presentesyelconstructorhijoqueimplementasupropioconstructorsinparmetros,nodebehacerexplcitamente
referenciaalconstructorpadreparaquelosdosconstructoresseejecutenempezandoporeldeltipopadre.
Elsiguienteejemplodeclaradosclases.Laclasebasecontieneunaimplementacinespecficaparaelconstructor
sinparmetrosylaclasehijanocontieneningnconstructor:
Lainstanciacindeunnuevoobjetosolosepodrhacerconunconstructorsinparmetros:
Editions ENI Tous droits rservs Copie personnelle de Jose Antonio Espino Lopez
- 5-
// No autorizado
// Autorizado
Como la clase hija no contiene implementacin explcita para el constructor con parmetros, es el constructor sin
parmetrosdelpadreelqueseejecuta.
Si la clase hija implementa su propio constructor de manera predeterminada, la instanciacin de un objeto hijo
implicaraimplcitamentelaejecucindelconstructorpadreydespuseldelconstructorhijo:
public ClaseHija()
{
this.PropiedadDeBase = 5;
}
Despusdelainstanciacin,elmiembroPropiedadDeBasetieneelvalor5:
Lapalabrareservadabasepermiteespecificarexplcitamentequconstructordelaclasepadrehayqueejecutary,
deestamanera,modificarestecomportamiento:
public ClaseHija()
: base(5)
{ }
La palabra reservada base se puede usar en todos los constructores de la clase hija, tengan o no parmetros,
para hacer referencia a cualquier constructor de la clase padre. Los parmetros pueden ser valores, como en el
ejemploanterior,oserparmetrosdelconstructorhijo,comoenelsiguienteejemplo:
public ClaseHija(int i)
: base(i)
{ }
Sea cual sea la notacin elegida, el constructor de la clase padre siempre se llamar seleccionando de manera
predeterminada el constructor sin parmetros, si no se especifica otro explcitamente. Adems, los constructores
dentrodeunaherenciasiempreseejecutarndelancestromslejano,hastaelobjetoinstanciado.Estopermite
asegurarlacorrectainicializacindelospadres.
8.Elpolimorfismo
La herencia implica el polimorfismo de las clases. Esto significa que toda clase derivada puede, implcitamente
convertirseenunobjetodesuclasebase.Tomemoscomoejemploestasdosclases:
- 6-
Editions ENI Tous droits rservs Copie personnelle de Jose Antonio Espino Lopez
ClaseHija
ClaseDeBase:
Losmiembrosespecficosdelaclasehijayanoestndisponiblesenelobjetodeltipopadre:
int i = cb.PropiedadHija;
// No autorizado
Elobjetonosealteraporlaconversinauntipopadre.Losdatosespecficosdeltipohijosiempreestnpresentes
enmemoria,peronosepuedenexplotar.
Laconversininversa,deltipopadrealtipohijo,sedebehacerdemaneraexplcita:
ce = (ClaseHija)cb;
Silaconversinexplcitafalla,cuandoelobjetoorigennosepuedeconvertiraltipodedestino,durantelaejecucin
seproduceunaexcepcindeltipo InvalidCastException.Paraevitargenerarunaexcepcinenlaejecucin,
laconversinsepuedehacermedianteeloperador as.Elobjetodestinotendrentoncesunareferencianullen
casodeerror:
ce = cb as ClaseHija;
Acontinuacinhayqueprobarsielresultadodelaconversinnoes nullparapoderutilizarelobjetodestinosin
generarerror:
if (ce != null)
{
// La conversin se ha realizado con xito
}
Sinestaprueba,laconversinsineloperadorasesmsventajosa,yaqueelerrorquesedaesmsdescriptivo:
int i = ((ClaseHija)cb).PropiedadHija;
int i = (cb as ClaseHija).PropiedadHija;
Editions ENI Tous droits rservs Copie personnelle de Jose Antonio Espino Lopez
- 7-
// Verdad
{ }
if (cb is ClaseHija)
// Verdad
{ }
Inclusosielobjetoseconvierteasutipopadre,lapruebaconeloperadorisreflejaqueelobjetoestenelorigen
deltipohijo.Estonoescierto,sielobjetosedeclaracomountipopadre:
// Verdad
{ }
if (cb2 is ClaseHija)
// Falso
{ }
- 8-
Editions ENI Tous droits rservs Copie personnelle de Jose Antonio Espino Lopez