Pergunta

Eu tenho feito alguns zombeteiro com RhinoMocks e que exige que os métodos zombaram ser feitas virtual. Isso é bom, exceto temos uma estrutura personalizada que contém os métodos que eu quero zombar que atualmente não são marcadas como virtual.

Eu não posso prever qualquer problema com fazer estes métodos virtual, mas eu queria saber quais são alguns perigos potenciais de fazer métodos virtual que eu deveria olhar para fora?

Foi útil?

Solução

Na verdade, ele pode ser muito problemático se o método não foi concebido para ser substituído e alguém o substituirá. Em particular, nunca chama um método virtual de um construtor. Considere o seguinte:

class Base {
    public Base() {
       InitializeComponent();
    }
    protected virtual void InitializeComponent() {
        ...
    }
}

class Derived : Base {
    private Button button1;
    public Derived() : base() {
        button1 = new Button();
    }
    protected override void InitializeComponent() {
        button1.Text = "I'm gonna throw a null reference exception"
    }
}

A classe derivada não pode estar ciente de que a chamada de método virtual irá resultar em seu método InitializeComponent sendo chamado antes de uma única linha de seu próprio construtor foi executado.

Outras dicas

  • Se você tiver usuários que substituem seus métodos virtuais você não pode selar-los novamente sem quebrar o código.
  • Qualquer métodos virtuais que você chama do construtor pode cair para implementações derivadas e se eles não chamar o método base eo construtor depende disso, o objeto pode estar em um estado inválido

Ayende tem um bom tratamento de métodos de trabalho como virtual:

http://ayende.com/Blog/archive/2007 /01/05/HowVirtualMethodsWork.aspx

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