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

Estoy creando una clase abstracta. Quiero que cada una de mis clases derivadas se vea obligada a implementar una firma específica de constructor. Como tal, hice lo que habría hecho si hubiera querido obligarlos a implementar un método, hice uno abstracto.

public abstract class A { abstract A(int a, int b); } 

Sin embargo, recibo un mensaje que dice que el modificador abstracto no es válido en este artículo. Mi objective era forzar un código como este.

 public class B : A { public B(int a, int b) : base(a, b) { //Some other awesome code. } } 

Este es todo el código C # .NET. ¿Puede alguien ayudarme?

Actualización 1

Yo quería agregar algunas cosas. Lo que terminé con esto fue esto.

 private A() { } protected A(int a, int b) { //Code } 

Eso hace lo que algunas personas dicen, el valor predeterminado es privado y la clase necesita implementar un constructor. Sin embargo, eso no FORCE un constructor con la firma A (int a, int b).

 public abstract class A { protected abstract A(int a, int b) { } } 

Actualización 2

Debería ser claro, para evitar esto, hice mi constructor predeterminado privado, y mi otro constructor protegido. Realmente no estoy buscando una manera de hacer que mi código funcione. Me ocupé de eso. Estoy buscando entender por qué C # no te permite hacer esto.

No puede tener un constructor abstracto porque abstracto significa que debe anularlo en cualquier clase secundaria no abstracta y no puede anular un constructor.

Si lo piensas bien, esto tiene sentido, ya que siempre llamas al constructor de la clase hija (con el nuevo operador) y nunca a la clase base.

En términos generales, la única forma en C # de imponer una firma de constructor específica es mediante el uso de la nueva () restricción genérica, que impone la existencia de un constructor sin parámetros para el parámetro de tipo.

Cambia ese constructor en la clase A a

 protected A(int a, int b) { // Some initialisation code here } 

Entonces tus subclases tendrán que usarlo, ya que no hay un constructor predeterminado.

Sin embargo, aún pueden cambiar la firma real del constructor. No hay forma de forzar que una subclase use una firma específica para su constructor, hasta donde yo sé. Estoy bastante seguro de que los constructores no pueden ser abstractos.

¿Para qué necesitas esto exactamente? Es posible que podamos sugerir una solución para esto.

Aunque no puede anular constructores, y por lo tanto no puede definir un constructor abstracto, puede colocar un método abstracto de fábrica en su clase base abstracta. Todas las clases derivadas necesitarían anular eso.

 public abstract class A { abstract A MakeAInstance(int a, int b); } public class B : A { // Must implement: override A MakeAInstance(int a, int b) { // Awesome way to create a B instance goes here } } 

Múltiples razones:

1) Los constructores no son heredados por lo que no puedes anularlos.

2) El constructor es una función miembro estática ya que no necesita una instancia específica para llamar. El resumen implica “virtual”, lo que significa que la implementación puede variar según cómo se subclasifique una instancia específica, que es lo contrario de la intención del significado de la palabra clave “estática”.

No se puede forzar la firma del constructor, ya que cada clase derivada puede (¡debe!) Definir su propio constructor (es), y pueden tomar cualquier parámetro que deseen.

Si necesita pasar un conjunto dado de variables a un objeto de una clase derivada, defina un método abstracto que necesita implementarse por clases derivadas. Si las clases no implementan el método abstracto, obtendrá un error de comstackción.

Espero que esto ayude a alguien nuevo como yo. Estaba buscando hacer una clase pública “normal” con un lector que toma argumentos y luego necesitaba convertirlo en una clase para niños, así que necesitaba una herramienta vacía para ello.

Yo no sabía esto antes: si haces un ctor protegido, la clase infantil lo ve pero el rest del progtwig no lo ve (supongo que mi confusión es porque en asp.net veo todo lo protegido en la página aspx que hereda de el cs …)