Pregunta

Me pregunto si hay alguna diferencia en las clases derivadas cuando se usan las clases abstractas frente a las reales para la herencia.

Me parece que la herencia de clase real crea una jerarquía, mientras que la herencia de clase abstracta es solo copiar y pegar código para el compilador a las clases derivadas.

¿La clase abstracta crea una jerarquía? ¿Se puede acceder usando una palabra clave especial?

Sé que usa la palabra clave base para acceder a la clase base, pero ¿los miembros abstractos se parecen a los miembros originales en las clases derivadas?

Por último, ¿cuál es la diferencia de rendimiento entre los 2?

¿Fue útil?

Solución

Sí, la clase abstracta existe: el compilador no hace una copia y pega. Sin embargo, no encontrará ninguna diferencia de rendimiento, ya que CLR aún debe realizar llamadas a métodos virtuales.

Por ejemplo, el siguiente C #:

abstract class Foo { }

class Bar : Foo { }

genera la siguiente IL:

.class private abstract auto ansi beforefieldinit Foo
    extends [mscorlib]System.Object { }

.class private auto ansi beforefieldinit Bar
    extends Foo { }

El concepto de un tipo abstracto forma parte de la IL.

Otros consejos

La única diferencia es que una clase base abstracta no puede instanciarse sin derivarse de ella, mientras que una no abstracta puede hacerlo. Desde el punto de vista de una clase derivada, todo es igual.

Las clases abstractas y las clases concretas son herramientas para el modelado (OO). No hay diferencia con respecto a las reglas de herencia y sustitución. Hay algunos tecnicismos:

  • Una clase abstracta no puede ser instanciado
  • Los métodos abstractos son solo permitido en clases abstractas

Pero una clase abstracta puede tener métodos, propiedades y campos no abstractos.

El rendimiento no está relacionado con las clases, pero existe una pequeña penalización para los métodos abstractos / virtuales.

El poder de la clase abstracta radica en su falta de implementación. Se puede usar para confiar en que la instancia de clases derivadas tendrá la funcionalidad necesaria

La clase abstracta es una forma primitiva de una clase base. No se pueden crear instancias, lo que significa que el desarrollador debe derivar de estas clases para usar su funcionalidad. Cualquier método abstracto definido en la clase abstracta debe implementarse en su clase secundaria. Entonces uno puede implementar métodos que deben estar presentes en la clase secundaria que se deriva de la clase abstracta. Por lo tanto, define los elementos básicos de un objeto que el desarrollador puede personalizar en una clase derivada según lo desee.

Las clases no abstractas se utilizan mejor para extender una funcionalidad de clase mientras que también continúan usando lo que está en la clase no abstracta. La clase derivada puede acceder a todos los miembros y métodos no privados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top