如何简化此嵌套泛型类型化类

本文关键字:泛型类型 类型化 泛型类 泛型 何简化 嵌套 | 更新日期: 2023-09-27 18:32:15

public interface IHasFeature<TFeature> { 
    TFeature Feature { get; set; } 
}
public class FeatureOne { 
    /*...*/ 
}
public class ProductOne : IHasFeature<FeatureOne> { 
    public FeatureOne Feature { get; set; } 
}
public abstract class BaseContainer<TProduct, TFeature> 
where TProduct : IHasFeature<TFeature> {
    public TProduct Product { get; set; }
    public void DoProcess() { 
        var result = Product.Feature.Execute(); //Execute is an extension method
    } 
}
public class MyContainer : BaseContainer<ProductOne, FeatureOne> { 
    /*...*/ 
} 

当我这样做时工作

MyContainer : BaseContainer<ProductOne, FeatureOne>

但我想:

MyContainer : BaseContainer<ProductOne>

ProductOne : IHasFeature<...>应该已经包含嵌套的通用功能TFeature,我不想在MyContainer构造中再次重复它们。

知道我该如何改进这一点吗?谢谢。

编辑2 -----------------------

删除了新关键字,正如 Nenad 所说,这是错误的。

如何简化此嵌套泛型类型化类

编译将

你对扩展方法的调用Execute()转换为对定义它的类的静态方法的调用。因此,当您在 DoProcess() 中调用 Product.Feature.Execute() 时,编译器需要知道Product.Feature的类型才能调用适当的扩展方法。

我的建议是这样写IHasFeature

public interface IHasFeature
{
    void DoSomethingWithFeature();
}

如果要保持IHasFeature通用性,最好的办法就是定义BaseContainer而不指定TFeature并在MyContainer中实现DoProcess()

public abstract class BaseContainer<TProduct>
{
    public TProduct Product { get; set; }
    public abstract void DoProcess();
}
public class MyContainer : BaseContainer<ProductOne>
{
    public override void DoProcess()
    {
        Product.Feature.Execute();
    }
}