使用基类时如何通过接口强制执行函数调用约定

时间:2018-09-07 02:47:44

标签: c# generics

我正在寻求创建一个BaseClass<TResponse, TRequest> where TRequest IsWorkable,该功能具有在流程中转换IsWorkable的功能。

我的难题是如何强制BaseClass的后代遵守接口,该接口在基类上强制执行函数调用约定,而不必在基类的所有后代上声明接口。我想避免用BaseClass装饰class NewClass : BaseClass<TResponse, TRequest>, IBase<TResponse, TRequest>的所有后代。

我宁愿使用NewClass : BaseClass<NewRequest, NewResponse>

令人困惑的修改 这是基类的定义,我可以以某种方式将接口从基类投影到超类上吗?

BaseClass<TResponse, TRequest>, IBaseClass<TResponse, TRequest> where TRequest IsWorkable

1 个答案:

答案 0 :(得分:2)

对于诸如WPF中的Converters之类的东西,我必须做很多事情,它们具有很多核心功能。

我的一般方法是足够泛化基类,以便我可以创建一个具有减少的参数的新方法并将其标记为abstract,然后从基类中调用该方法。这意味着任何继承都必须实现新方法。

BaseConverter.cs:

public class BaseConverter<TConvert, TConvertBack> : IValueConverter
{
    protected CultureInfo CurrentCulture { get; set;}

    public virtual object Convert(object value, Type targetType, object parameters, CultureInfo culture)
    {
        CurrentCulture = culture;

        // Generic methods to check types and conversions....
        var typedValue = (TConvert)value;

        return Convert(typedValue, targetType, parameters);
     }

     protected abstract Convert(TConvert value, Type targetType, object parameters);

     /// Implement rest of interfaces/generic
}

StringToBooleanConverter.cs:

public class StringToBooleanConverter : BaseConverter<string, bool>
{
    protected override object Convert(string value, Type targetType, object parameters)
    {
        bool retVal = false;
        // Convert string to boolean and assign to retVal
        return retVal;
    }
}