2014-03-03 130 views
0

我從ReSharper的一條警告消息,「在構造虛擬成員發起呼叫」 Classification = new T();虛擬成員調用抽象類

public abstract class Creature<T> where T : new() { 

    protected Creature() 
    { 
     Classification = new T(); 
    } 

    public abstract T Classification { get; protected set; } 
} 

public class Dog : Creature<Animal> 
{ 
    public override Animal Classification { get; protected set; } 

} 

public class Animal{ 

public void AnimalSpecificMethod() { } 

} 

我怎樣才能解決這個prolbem?也許有想法重新設計這個結構?

我想實現的是在Dog類中創建包含分類的相同類類型,因爲它已通過生物類聲明。

謝謝!

+5

Classification屬性是否真的需要抽象?你會做任何特定的吸氣和二手設備嗎?如果沒有,只要使其非抽象(和非虛擬)。 –

+2

http://stackoverflow.com/questions/119506/virtual-member-call-in-a-constructor?rq=1 –

+0

可能的重複警告是因爲您在派生類之前調用​​派生類的方法已經構建...它可能會讓您打開異常,因爲派生類的屬性尚未初始化。最簡單的事情是創建一個初始化函數 –

回答

0

的問題是,這個調用,在構造函數中,是對二傳手虛擬呼叫:

Classification = new T(); 

可以轉而增加一個字段支持的屬性,這將避免問題:

protected Creature() 
{ 
    _classification = new T(); 
} 

private T _classification; 

public virtual T Classification 
{ 
    get { return _classification; } 
    protected set { _classification = value; } 
} 

這似乎是一個奇怪的設計,但我不能提供任何具體的設計建議,沒有你想要實現的更多細節。狗/分類示例對於特定的建議太籠統。上述更改將解決您的緊急問題。