C#泛型基类场景下如何声明YYY.Bar参数以接受CCC实例
问题原因
你定义的BBB<T>是带泛型参数的开放泛型类型,C# 不支持直接将未绑定类型参数的开放泛型类型作为参数类型使用,这和 Java 支持的BBB<?>通配符用法规则不同,因此你原来的Bar(BBB bbb, int value)声明会直接编译报错。
解决方案
有两种常用实现方案,你可以根据业务场景选择:
方案1:抽离非泛型公共接口(推荐)
如果你在Bar方法内仅需要调用BBB的公共非泛型方法,最简洁的方式是把公共能力抽象为非泛型接口:
- 定义非泛型接口
public interface IBBB { void SomeMethod(); }
- 让
BBB<T>实现该接口
public abstract class BBB<T> : AAA<T>, IBBB where T : BBB<T> { public void SomeMethod() { } }
- 修改
Bar方法参数类型为接口
public void Bar(IBBB bbb, int value) { bbb.SomeMethod(); }
这个方案的优势是YYY类完全不需要感知泛型逻辑,依赖更轻,符合依赖倒置原则。
方案2:将Bar改为泛型方法
如果你后续需要在Bar方法内使用T类型相关的泛型能力,可以把Bar声明为带约束的泛型方法:
public void Bar<T>(T bbb, int value) where T : BBB<T> { bbb.SomeMethod(); }
调用时不需要修改原有代码,C# 会自动完成泛型类型推断,你原有的Bar(instance, 0)调用可以直接正常运行。
内容的提问来源于stack exchange,提问作者Michael Gaugy
相关产品推荐
相关产品推荐

