Pergunta

Eu tenho um (mal escrito) classe base que eu quero envolver em um objeto proxy. A classe base é semelhante ao seguinte:

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

   public BaseClass(int someValue) {}

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

e, meus assemelha de proxy:

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

Sem o construtor "Fakeout", o construtor base está prevista para ser chamado. No entanto, com ele, eu esperava não ser chamado. De qualquer maneira, eu nem preciso de uma maneira de não chamar nenhum construtor da classe base, ou alguma outra maneira de efetivamente proxy para esta (mal) classe.

Foi útil?

Solução

Se você não chamar explicitamente qualquer construtor na classe base, o construtor sem parâmetros será chamado implicitamente. Não há maneira de contornar isso, você não pode instanciar uma classe sem um construtor que está sendo chamado.

Outras dicas

Existe uma maneira de criar um objeto sem chamar qualquer instância construtores.

Antes de prosseguir, ser muito certo de que quer fazê-lo desta forma. 99% do tempo esta é a solução errada.

Isto é como fazê-lo:

FormatterServices.GetUninitializedObject(typeof(MyClass));

Chamá-lo no lugar do construtor do objeto. Ele vai criar e retornar uma instância sem chamar qualquer construtores ou inicializadores de campo.

Quando você desserializar um objeto no WCF, ele usa esse método para criar o objeto. Quando isso acontece, construtores e inicializadores de campo ainda não são executados.

No mínimo 1 ctor tem que ser chamado. A única maneira de contornar isso eu vejo é a contenção. Tem o interior classe ou referência a outra classe.

Se o que você quer é não Chamada de qualquer um dos dois construtores de classe base, isso não pode ser feito.

C construtores # classe deve chamar construtores de classe de base. Se você não chamar um explicitamente, base () está implícito . No seu exemplo, se você não especificar qual construtor da classe base a chamada, é o mesmo que:

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

Se você preferir usar outro construtor da classe base, você pode usar:

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

De qualquer forma, um dos dois ser chamado, explícita ou implicitamente.

Eu não acredito que você pode obter em torno de chamar o construtor. Mas você poderia fazer algo parecido com isto:

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
   }
} 

Quando você cria um objeto BaseClassProxy ele precisa criar uma instância de sua classe base, então você precisa chamar o construtor da classe base, o que você pode doo é escolher um wich de chamada, como:

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

Para chamar o segundo construtor em vez do primeiro

Eu tenho medo que não base de construtor de chamada não é opção.

eu acabei fazendo algo parecido com isto:

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

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

Isto começou-me em torno de algumas das más práticas da classe base.

construtores são públicas por natureza. não use um construtor e usar um outro para a construção e torná-lo private.so você criar uma instância com nenhuma chamada paramtersand essa função para a construção de sua instância do objeto.

Tudo bem, aqui é uma solução feio para o problema de uma classe herdar construtores de outra classe que eu não queria permitir que alguns deles ao trabalho. Eu estava esperando para evitar o uso de isso na minha classe, mas aqui está:

Aqui está o meu construtor da classe:

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

OK agora você foi advertido de que era feio. Não há queixas agradar!

Eu queria vigor, pelo menos os parâmetros mínimos do meu construtor principal sem ele permitindo que o construtor base herdada sem parâmetros.

Eu também acredito que se você criar um construtor e não colocar o:. Base () depois que ele não vai chamar o construtor da classe base E se você criar construtores para todos os na classe base e fornecer os mesmos parâmetros exatos para eles na classe principal, que ele não vai passar. Mas isto pode ser tedioso se você tem um monte de construtores na classe base!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top