Pregunta

Tengo una clase base (mal escrita) que quiero envolver en un objeto proxy. La clase base se parece a lo siguiente:

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   public BaseClass(int someValue) {}

   //...more code, not important here
}

y, mi proxy se parece:

public BaseClassProxy : BaseClass
{
  public BaseClassProxy(bool fakeOut){}
}

Sin el " fakeOut " constructor, se espera que el constructor base sea llamado. Sin embargo, con ello, esperaba que no se llamara. De cualquier manera, necesito una forma de no llamar a ningún constructor de clase base, o alguna otra forma de poder representar esta clase (mala) de manera efectiva.

¿Fue útil?

Solución

Si no llama explícitamente a ningún constructor en la clase base, se llamará implícitamente al constructor sin parámetros. No hay forma de evitarlo, no puede crear una instancia de una clase sin que se llame a un constructor.

Otros consejos

Hay una forma de crear un objeto sin llamar a ningún constructores de instancia

.

Antes de continuar, asegúrese de que desea hacerlo de esta manera. El 99% de las veces esta es la solución incorrecta.

Así es como lo haces:

FormatterServices.GetUninitializedObject(typeof(MyClass));

Llámelo en lugar del constructor del objeto. Creará y le devolverá una instancia sin llamar a ningún constructor o inicializador de campo.

Cuando deserializa un objeto en WCF, utiliza este método para crear el objeto. Cuando esto sucede, los constructores e incluso los inicializadores de campo no se ejecutan.

Se debe llamar al menos 1 ctor. La única manera de evitarlo es la contención. Tener la clase dentro o haciendo referencia a la otra clase.

Si lo que quieres es no llamar a cualquiera de los dos constructores de clase base, esto no se puede hacer.

Los constructores de la clase C # deben llamar a los constructores de la clase base. Si no llama a uno explícitamente, base () está implícito . En su ejemplo, si no especifica a qué constructor de clase base llamar, es lo mismo que:

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base() { }
}

Si prefiere usar el otro constructor de clase base, puede usar:

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base(someIntValue) { }
}

De cualquier manera, se llamará a uno de los dos , explícita o implícitamente.

No creo que puedas evitar llamar al constructor. Pero podrías hacer algo como esto:

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   protected virtual void Setup()
   {
   }
}

public BaseClassProxy : BaseClass
{
   bool _fakeOut;
   protected BaseClassProxy(bool fakeOut)
   {
        _fakeOut = fakeOut;
        Setup();
   }

   public override void Setup()
   {
       if(_fakeOut)
       {
            base.Setup();
       }
       //Your other constructor code
   }
} 

Cuando creas un objeto BaseClassProxy NECESITA crear una instancia de su clase base, por lo que necesitas llamar al constructor de la clase base, lo que puedes hacer es elegir cuál llamar, como:

public BaseClassProxy (bool fakeOut) : base (10) {}

Para llamar al segundo constructor en lugar del primero

Me temo que el constructor de llamadas de base no es una opción.

Terminé haciendo algo como esto:

public class BaseClassProxy : BaseClass 
{
   public BaseClass BaseClass { get; private set; }

   public virtual int MethodINeedToOverride(){}
   public virtual string PropertyINeedToOverride() { get; protected set; }
}

Esto me ayudó a evitar algunas de las malas prácticas de la clase base.

los constructores son públicos por naturaleza. no use un constructor, use otro para la construcción y hágalo privado. Así que crearía una instancia sin parámetros y llamaría a esa función para construir su instancia de objeto.

De acuerdo, aquí hay una solución fea al problema de una clase que hereda a los constructores de otra clase que no quería que funcionara. Esperaba evitar el uso de esto en mi clase pero aquí está:

Aquí está mi constructor de clase:

public MyClass();
{
   throw new Exception("Error: Must call constructor with parameters.");
}

Bien, ahora te avisaron que era feo. ¡No tengo ninguna queja, por favor!

Quería forzar al menos los parámetros mínimos de mi constructor principal sin permitir que el constructor base heredado sin parámetros.

También creo que si creas un constructor y no pones: base () después de eso, no llamará al constructor de la clase base. Y si creas constructores para todos los en la clase base y proporcione los mismos parámetros exactos para ellos en la clase principal, que no pasará. ¡Pero esto puede ser tedioso si tienes muchos constructores en la clase base!

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