2011-04-14 114 views
13
public interface IAutomatizableEvent 
{ 
    Event AutomatizableEventItem { get; } 
    bool CanBeAutomatic { get; } 
    bool IsAutomaticallyRunning { get; } 

    bool OnBeforeAutomaticCall(); 
    bool OnAutomaticCheck(); 
    void OnAutomaticStart(); 
    void OnAutomaticCancel(); 
} 

public abstract class AutomatizableEvent : IAutomatizableEvent 
{ 
    public AutomatizableEvent() 
    { 
    } 

    #region Implementation of IAutomatizableEvent 

    public abstract Event AutomatizableEventItem { get; } 
    public abstract bool CanBeAutomatic { get; } 
    public abstract bool IsAutomaticallyRunning { get; } 
    public abstract bool OnBeforeAutomaticCall(); 
    public abstract bool OnAutomaticCheck(); 
    public abstract void OnAutomaticStart(); 
    public abstract void OnAutomaticCancel(); 

    #endregion 
} 



public static class EventSystem 
{ 
    public static List<EventSystemBase<Event, AutomatizableEvent>> AutomatizableEvents { get; set; } 
    [...] 
} 

「類型‘AutomatizableEvent’必須有一個公共的無參數構造函數,以便在通用類使用它作爲參數‘K’‘EventSystemBase’」必須有一個公共無參數構造函數,它不?

public abstract class EventSystemBase<T, K> : AutomatizableEvent 
    where T : Event 
    where K : AutomatizableEvent, new() 

我的問題是...沒有按」 t AutomatizableEvent DO有一個公共無參數構造函數?

+1

爲了滿足'new()'約束條件,您必須能夠使用'= new AutomatizableEvent()'初始化這個類,因爲它是抽象的。創建一個具體的子類並使用它。 – ja72 2011-04-14 00:41:58

回答

31

錯誤說明是錯誤的,但錯誤是正確的。

AutomatizableEvent由於約束where K : new()而不能用作通用參數K。抽象類不滿足這個約束。

抽象類的構造函數總是受到有效保護,因爲抽象只能創建爲派生類的基礎子對象,構造函數也可以只由派生類的構造函數調用,並且只在構造函數鏈中。具體而言,EventSystemBase<T, K>在上下文new K()中不能使用。

+1

很好的答案和很好的解釋。 +1 – Liz 2011-04-14 01:05:42

+0

非常好的解釋! +1 – 2014-03-06 17:16:10

6

你不能實例化一個抽象類

相關問題