sirve - utilice la palabra new para crear una instancia de objeto c#
¿Cómo puedo evitar que un heredero invoque un constructor base en C#? (9)
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 a
public BaseClassProxy : BaseClass
{
public BaseClassProxy(bool fakeOut){}
}
Sin el constructor "fakeOut", se espera que se llame al constructor base. Sin embargo, con eso, esperaba que no se llamara. De cualquier manera, o necesito una forma de no llamar a ningún constructor de la clase base, o de alguna otra forma para proxy eficaz esta clase (mal).
Cuando crea un objeto BaseClassProxy NECESITA crear una instancia de su clase base, por lo que necesita llamar al constructor de la clase base, lo que puede hacer es elegir a cuál llamar, como:
public BaseClassProxy (bool fakeOut) : base (10) {}
Llamar al segundo constructor en lugar del primero
No creo que pueda comunicarse con el 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
}
}
Si lo que quiere es no llamar a ninguno de los dos constructores de la 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 la clase base llamar, es lo mismo que:
public BaseClassProxy : BaseClass
{
public BaseClassProxy() : base() { }
}
Si prefiere usar el otro constructor de la 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.
Si no llama explícitamente a ningún constructor en la clase base, el constructor sin parámetros se llamará implícitamente. No hay forma de evitarlo, no puedes instanciar una clase sin que se llame a un constructor.
Tengo miedo de que el constructor de llamadas base no sea 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 resolver algunas de las malas prácticas de la clase base.
Al menos 1 ctor tiene que ser llamado. La única forma de evitarlo es la contención. Tener la clase dentro o haciendo referencia a la otra clase.
los constructores son públicos por naturaleza. no use un constructor y use otro para la construcción y hágalo privado. De este modo, crearía una instancia sin parámetros y llamaría a esa función para construir su instancia de objeto.
Hay una forma de crear un objeto sin llamar a ningún constructor de instancia.
Antes de continuar, asegúrese de querer 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ámalo 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, usa este método para crear el objeto. Cuando esto sucede, los constructores e incluso los inicializadores de campo no se ejecutan.