Herencia en C# Notas generales



Descargar 15,28 Kb.
Fecha de conversión01.03.2017
Tamaño15,28 Kb.

Herencia en C#

Notas generales

Derivación de clases

Extensión de clases base

  • Sintaxis para derivar una clase desde una clase base
  • Una clase derivada hereda la mayor parte de los elementos de su clase base
  • Una clase derivada no puede ser más accesible que su clase base
  • class Token
  • {
  • ...
  • }
  • class ComentToken: Token
  • {
  • ...
  • }
  • ComentToken
  • « concrete »
  • Token
  • « concrete »
  • Clase derivada
  • Clase base
  • 2 puntos

Acceso a miembros de la clase base

  • Los miembros heredados con protección están implícitamente protegidos en la clase derivada
  • Los miembros de una clase derivada sólo pueden acceder a sus miembros heredados con protección
  • En una struct no se usa el modificador de acceso protected
  • class Token
  • { ... class Outside
  • protected string name; {
  • } void Fails(Token t)
  • class ComentToken: Token {
  • { ... ...
  • public string Name( ) t.name
  • { ...
  • return name; }
  • } }
  • }

Llamadas a constructores de la clase base

  • Las declaraciones de constructores deben usar la palabra base
  • Una clase derivada no puede acceder a un constructor privado de la clase base
  • Se usa la palabra base para habilitar el ámbito del identificador
  • class Token
  • {
  • protected Token(string name) { ... }
  • ...
  • }
  • class ComentToken: Token
  • {
  • public ComentToken(string name) : base(name) { }
  • ...
  • }

Implementación de métodos

  • Definición de métodos virtuales
  • Uso de métodos virtuales
  • Sustitución de métodos (override)
  • Uso de métodos override
  • Uso de new para ocultar métodos
  • Uso de la palabra reservada new

Definición de métodos virtuales

  • Sintaxis: Se declara como virtual
  • Los métodos virtuales son polimórficos
  • class Token
  • {
  • ...
  • public int LineNumber( )
  • { ...
  • }
  • public virtual string Name( )
  • { ...
  • }
  • }

Uso de métodos virtuales

  • Para usar métodos virtuales:
    • No se puede declarar métodos virtuales como estáticos
    • No se puede declarar métodos virtuales como privados

Sustitución de métodos (override)

  • Sintaxis: Se usa la palabra reservada override
  • class Token
  • { ...
  • public virtual string Name( ) { ... }
  • }
  • class ComentToken: Token
  • { ...
  • public override string Name( ) { ... }
  • }

Uso de métodos override

  • Sólo se sustituyen métodos virtuales heredados idénticos
  • Un método override debe coincidir con su método virtual asociado
  • Se puede sustituir un método override
  • No se puede declarar explícitamente un override como virtual
  • No se puede declarar un método override como static o private
  • class Token
  • { ...
  • public int LineNumber( ) { ... }
  • public virtual string Name( ) { ... }
  • }
  • class ComentToken: Token
  • { ...
  • public override int LineNumber( ) { ... }
  • public override string Name( ) { ... }
  • }

Uso de new para ocultar métodos

  • Sintaxis: Para ocultar un método se usa la palabra reservada new
  • class Token
  • { ...
  • public int LineNumber( ) { ... }
  • }
  • class ComentToken: Token
  • { ...
  • new public int LineNumber( ) { ... }
  • }

Uso de la palabra reservada new

  • Ocultar tanto métodos virtuales como no virtuales
  • Resolver conflictos de nombre en el código
  • Ocultar métodos que tengan signaturas idénticas
  • class Token
  • { ...
  • public int LineNumber( ) { ... }
  • public virtual string Name( ) { ... }
  • }
  • class ComentToken: Token
  • { ...
  • new public int LineNumber( ) { ... }
  • public override string Name( ) { ... }
  • }

Uso de clases selladas

  • Ninguna clase puede derivar de una clase sellada
  • Las clases selladas sirven para optimizar operaciones en tiempo de ejecución
  • Muchas clases de .NET Framework son selladas: String, StringBuilder, etc.
  • Sintaxis: Se usa la palabra reservada sealed
  • namespace System
  • {
  • public sealed class String
  • {
  • ...
  • }
  • }
  • namespace Mine
  • {
  • class FancyString: String { ... }
  • }

Uso de interfaces

  • Declaración de interfaces
  • Implementación de varias interfaces
  • Implementación de métodos de interfaz

Declaración de interfaces

  • Sintaxis: Para declarar métodos se usa la palabra reservada interface
  • interface IToken
  • {
  • int LineNumber( );
  • string Name( );
  • }
  • IToken
  • « interface »
  • LineNumber( )
  • Name( )
  • Métodos sin cuerpo
  • Los nombres de interfaces empiezan con “I”mayúscula
  • Sin espec. de acceso

Implementación de varias interfaces

  • Una clase puede implementar cero o más interfaces
  • Una interfaz puede extender cero o más interfaces
  • Una clase puede ser más accesible que sus interfaces base
  • Una interfaz no puede ser más accesible que su interfaz base
  • Una clase implementa todos los métodos de interfaz heredados
  • interface IToken
  • {
  • string Name( );
  • }
  • interface IVisitable
  • {
  • void Accept(IVisitante v);
  • }
  • class Token: IToken, IVisitable
  • { ...
  • }
  • IToken
  • « interface »
  • IVisitable
  • « interface »
  • Token
  • « concrete »

Implementación de métodos de interfaz

  • El método que implementa debe ser igual que el método de interfaz
  • El método que implementa puede ser virtual o no virtual
  • class Token: IToken, IVisitable
  • {
  • public virtual string Name( )
  • { ...
  • }
  • public void Accept(IVisitante v)
  • { ...
  • }
  • }
  • Mismo acceso
  • Mismo retorno
  • Mismo nombre
  • Mismos parámetros

Uso de clases abstractas

  • Declaración de clases abstractas
  • Uso de clases abstractas en una jerarquía de clases
  • Comparación de clases abstractas e interfaces
  • Implementación de métodos abstractos
  • Uso de métodos abstractos

Declaración de clases abstractas

  • Se usa la palabra reservada abstract
  • abstract class Token
  • {
  • ...
  • }
  • class Test
  • {
  • static void Main( )
  • {
  • new Token( );
  • }
  • }
  • Token
  • { abstract }
  • No se pueden crear instancias
  • de una clase abstracta

Uso de clases abstractas en una jerarquía de clases

  • interface IToken
  • {
  • string Name( );
  • }
  • abstract class Token: IToken
  • {
  • string IToken.Name( )
  • { ...
  • }
  • ...
  • }
  • class ComentToken: Token
  • { ...
  • }
  • class KeywordToken: Token
  • { ...
  • }
  • Ejemplo 1
  • Token
  • { abstract }
  • IToken
  • « interface »
  • Coment
  • Token
  • « concrete »
  • Keyword
  • Token
  • « concrete »

Uso de clases abstractas en una jerarquía de clases (cont.)

  • interface IToken
  • {
  • string Name( );
  • }
  • abstract class Token
  • {
  • public virtual string Name( )
  • { ...
  • }
  • ...
  • }
  • class ComentToken: Token, IToken
  • { ...
  • }
  • class KeywordToken: Token, IToken
  • { ...
  • }
  • Ejemplo 2
  • Token
  • { abstract }
  • IToken
  • « interface »
  • Coment
  • Token
  • « concrete »
  • Keyword
  • Token
  • « concrete »

Comparación de clases abstractas e interfaces

  • Parecidos
  • Diferencias
    • Las interfaces no pueden contener implementaciones
    • Las interfaces no pueden declarar miembros no públicos
    • Las interfaces no pueden extender nada que no sea una interfaz

Implementación de métodos abstractos

  • Sintaxis: Se usa la palabra reservada abstract
  • Sólo clases abstractas pueden declarar métodos abstractos
  • Los métodos abstractos no pueden tener cuerpo
  • abstract class Token
  • {
  • public virtual string Name( ) { ... }
  • public abstract int Longitud( );
  • }
  • class ComentToken: Token
  • {
  • public override string Name( ) { ... }
  • public override int Longitud( ) { ... }
  • }

Uso de métodos abstractos

  • Los métodos abstractos son virtuales
  • Los métodos override pueden sustituir a métodos abstractos en otras clases derivadas
  • Los métodos abstractos pueden sustituir a métodos de la clase base declarados como virtuales
  • Los métodos abstractos pueden sustituir a métodos de la clase base declarados como override

Práctica – Uso de herencia para implementar una interfaz






La base de datos está protegida por derechos de autor ©absta.info 2019
enviar mensaje

    Página principal