usar una sirve sellada que protegido propiedad programacion para nuevo miembro metodos metodo ejemplos declarado clases clase caracteristicas abstractas abstracta c# .net constructor abstract-class

una - Constructor abstracto en C#



que es una clase abstracta en programacion (8)

Posible duplicado:
¿Por qué no puedo crear un constructor abstracto en una clase abstracta de C #?

Por qué no puedo declarar abstracto un constructor de mi clase como este:

public abstract class MyClass { public abstract MyClass(int param); }


Los constructores están más cerca de los métodos estáticos que de los métodos "regulares". Al igual que los métodos estáticos, pueden sobrecargarse , pero no anularse . Es decir, no son heredados, pero pueden redefinirse.

public BaseClass { public BaseClass( String s ) { ... } public static void doIt ( String s ) { ... } } public SubClass extends BaseClass { public SubClass( String s ) { ... } public static void doIt ( String s ) { ... } } public SubClass2 extends BaseClass { } new SubClass( "hello" ); SubClass.doIt( "hello" ); new SubClass2( "hello" ); // NOK SubClass2.doIt( "hello" ); // NOK

Los constructores y los métodos estáticos nunca se envían de forma dinámica (prácticamente). Siempre se conoce el tipo de hormigón que crea la instancia o la clase concreta del método estático. Es por eso que no tiene sentido tener un constructor abstracto y un método estático abstracto . Es por eso que tampoco puedes especificar el constructor y el método estático en las interfaces .

Incluso puedes pensar en el constructor como método de fábrica estático (y ver el patrón correspondiente ):

MyClass obj = new MyClass(); // the way it is MyClass obj = MyClass.new(); // think of it like this

El único caso en el que veo dónde tendría sentido definir el constructor abstracto o el método estático abstracto sería si se usa la reflexión . En este caso, puede asegurarse de que todas las subclases redefinan el método estático correspondiente o el constructor. Pero la reflexión es otro tema ...

Nota : en idiomas como Smalltalk donde las clases son objetos regulares, puede anular el método estático y tener un constructor abstracto. Pero no se aplica a Java porque las clases no son objetos "regulares", incluso si puede obtenerlos con reflexión.


Los constructores solo son aplicables a la clase en la que están definidos, es decir, no son heredados. Se utilizan constructores de clase base (debe llamar a uno de ellos, incluso si solo llama al predeterminado automáticamente) pero no se anulan derivando clases. Puede definir un constructor en una clase base abstracta: no se puede usar directamente, pero puede invocarse derivando clases. Lo que no puede hacer es obligar a una clase derivada a implementar una firma de constructor específica.

Es perfectamente razonable tener un constructor definido, generalmente como protegido, para definir algún código de configuración común para todas las clases derivadas. Esto es especialmente cierto, tal vez, cuando la clase abstracta proporciona algún otro comportamiento predeterminado que se basa en esta configuración. Por ejemplo:

public abstract class Foo { public string Name { get; private set; } protected Foo( string name ) { this.Name = name; } } public class Bar : Foo { public Bar() : base("bar") { ... } }


No puede declararlo abstract , pero puede tener un constructor en su clase abstracta; simplemente elimine la palabra abstract y proporcione un cuerpo para ella.


Por definición, la clase no se puede instanciar directamente, por lo que en cierto sentido, ya es abstracta.


Porque los constructores abstractos no son compatibles.

Pero una clase abstracta puede tener un constructor.


Que mal con esto:

public abstract class MyClass { protected MyClass(int param) { } }

En este caso, usted obliga a todas las clases derivadas a llamar al constructor de la clase base.


Resumen implica virtual. Un constructor no predeterminado nunca se puede llamar de forma polimórfica, por lo que no se permiten los constructores virtuales y abstractos.

SI en una versión futura de C #, los genéricos se mejoran para permitir la invocación de constructores no predeterminados a través de un parámetro de tipo genérico, entonces las llamadas polimórficas a los constructores serían posibles y también podrían agregarse constructores virtuales y abstractos.