Constructor abstracto en C # [duplicar]


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);
}
Author: Community, 2010-02-19

8 answers

Los constructores solo son aplicables a la clase en la que están definidos, es decir, no son heredados. Los constructores de clases base son usados (tienes que llamar a uno de ellos, incluso si solo llamas al predeterminado automáticamente) pero no son reemplazados por clases derivadas. Puede definir un constructor en una clase base abstracta it no se puede usar directamente, pero se puede invocar derivando clases. Lo que no puedes hacer es forzar a una clase derivada a implementar un constructor específico firma.

Es perfectamente razonable tener un constructor definido, típicamente como protegido, con el fin de 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")
     {
        ...
     }
}
 67
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-30 01:44:29

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

 12
Author: Zach Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-19 21:11:09

Lo abstracto implica lo virtual. Un constructor no predeterminado nunca puede ser llamado polimórficamente, por lo que virtual y abstracto no están permitidos en los constructores.

SI en una versión futura de C#, los genéricos se mejoran para permitir llamar a 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 los constructores virtuales y abstractos también podrían agregarse.

 6
Author: Ben Voigt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-19 19:48:07

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 ser sobrecargados, pero no anulados. Es decir, no se heredan, sino que se pueden redefinir.

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 son nunca enviados dinámicamente (virtualmente) You Usted siempre sabe el tipo concreto que instanciaó o la clase concreta del método estático. Es por eso que no tiene sentido tener constructor abstracto y método estático abstracto. Es por eso que tampoco puede especificar constructor y método estático en interfaces.

Incluso puedes pensar en constructor como método estático de fábrica (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 que veo donde tendría sentido definir constructor abstracto o método estático abstracto sería si reflexión se utiliza. En este caso, podría asegurarse de que todas las subclases redefinirían el correspondiente método estático o constructor. Pero la reflexión es otro tema...

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

 5
Author: ewernli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-20 11:25:46

Qué hay de malo en esto:

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

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

 4
Author: Sergey Teplyakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-19 19:38:19

Porque los constructores abstractos no son compatibles.

Pero una clase abstracta puede tener un constructor.

 3
Author: Davy Landman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-19 19:37:13

Un constructor no es un método ordinario. Tiene un propósito especial, y por lo tanto está restringido a las características del lenguaje que tienen sentido para ese propósito. Ver también: ¿Por qué los constructores no devuelven valores?

 1
Author: Daniel Earwicker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:23

Por definición, la clase no puede ser instanciada directamente, así que en cierto sentido, ya es abstracta.

 0
Author: Michael Bray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-19 19:35:57