【问题标题】:Must have a public parameterless constructor, it doesn't?必须有一个公共的无参数构造函数,不是吗?
【发布时间】:2011-04-14 00:27:16
【问题描述】:
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' 类型必须有一个公共的无参数构造函数,才能将其用作泛型类 'EventSystemBase' 中的参数 'K'”

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

我的问题是...... AutomatizableEvent DO HAVE 没有公共无参数构造函数吗??

【问题讨论】:

  • 要满足new() 约束,您必须能够使用=new AutomatizableEvent() 初始化类,因为它是抽象的,所以您不能。创建一个具体的子类并使用它。

标签: c# generics interface


【解决方案1】:

错误描述错误,但错误是正确的。

AutomatizableEvent 不能用作通用参数 K,因为约束 where K : new()。抽象类不满足该约束。

抽象类的构造函数总是受到有效保护,因为抽象只能作为派生类的基子对象创建,构造函数同样只能由派生类的构造函数调用,并且只能在构造函数链接中。具体来说,EventSystemBase&lt;T, K&gt; 不能在上下文 new K() 中使用它。

【讨论】:

  • 很好的答案,很好的解释。 +1
  • 很好的解释! +1
【解决方案2】:

你不能实例化一个抽象类

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多