【问题标题】:Force derived class to implement method with Generics - C# [duplicate]强制派生类使用泛型实现方法 - C# [重复]
【发布时间】:2018-04-09 23:01:03
【问题描述】:

是否可以让抽象基类强制其派生类使用泛型实现特定方法,同时仍然能够在其他地方使用抽象基类?这就是我的意思:

public abstract class BaseFieldValue<ToutputType,TinputType>
{
   public abstract ToutputType DoStuff(TinputType input);
}

public class StringField:BaseFieldValue<string,string>
{
    public string StringValue { get; set; }
    public override string DoStuff(string input)
    {
        //Custom implementation for this class
    }
}


public class Project
{
    public string ProjectName { get; set; }
    public List<BaseFieldValue> ProjectFields {get;set;} //ERROR
}

BaseFieldValue 的继承 -> StringField 编译得很好,但是当我尝试在 Project 上使用 List&lt;BaseFieldValue&gt; 时,它不喜欢这种语法,因为它想要定义泛型类型。我正在尝试做的事情是可能的还是有更好的方法?

我目前正在所有这些派生类上实现一个接口,但这迫使我记住它需要在每个派生类上继续。我希望对任何派生自BaseFieldValue 的类强制执行通用合同。

【问题讨论】:

    标签: c# generics abstract-class


    【解决方案1】:

    只要让你的泛型基类继承一个非泛型基类或接口:

    public abstract class BaseFieldValue 
    {
    }
    
    public abstract class BaseFieldValue<ToutputType,TinputType> : BaseFieldValue
    {
       public abstract ToutputType DoStuff(TinputType input);
    }
    

    我目前正在所有这些派生类上实现一个接口...

    在这种情况下,您可以考虑只使用此接口而不是抽象基类。

    public abstract class BaseFieldValue<ToutputType,TinputType> : IFieldValue
    {
        ...
    }
    
    public class Project
    {
        public string ProjectName { get; set; }
        public List<IFieldValue> ProjectFields {get;set;}
    }
    

    【讨论】:

    • 这很棒,我没有意识到我可以这样构建它。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多