c# - 接口继承设计问题
问题描述
我有一个类似于这个例子的设计:
interface IFoo<T1>
{
IBar<T1> Bar { get; }
}
interface IFoo<T1, T2> : IFoo<T1>
{
new IBar<T1, T2> Bar { get; }
}
class Foo<T1> : IFoo<T1>
{
public IBar<T1> Bar { get; private set; }
public Foo(IBar<T1> bar)
{
Bar = bar;
}
}
class Foo<T1, T2> : Foo<T1>, IFoo<T1, T2>
{
public Foo(IBar<T1, T2> bar) : base(bar) { }
public new IBar<T1, T2> Bar { get{return base.Bar as IBar<T1, T2>;} }
}
interface IBar<T1>...
class Bar<T1> : IBar<T1>...
interface IBar<T1, T2> : IBar<T1>...
class Bar<T1, T2> : Bar<T1>, IBar<T1, T2>...
然后可以这样使用:
var bar = new Bar<int, int>();
var foo = new Foo<int, int>(bar);
或者像这样:
var bar = new Bar<int>();
var foo = new Foo<int>(bar);
甚至:
var bar = new Bar<int, int>();
var foo = new Foo<int>(bar);
唯一不起作用的组合是将派生最少的 bar 传递给派生最多的 foo。
var bar = new Bar<int>();
var foo = new Foo<int, int>(bar); //does not work
调用基本构造函数时有一个 bar 类型转换,而在访问派生类中的属性时有一个类型转换,但这只是通过它都支持的两个不同接口访问同一个对象。
我实际上发现这个结构非常整洁和高效。这也是相当安全的:如果你试图弄乱参数,强制转换将会失败。
您是否发现此设计有任何缺陷,如果有,如何改进?
解决方案
推荐阅读
- jenkins - 在詹金斯奴隶上创建新变量
- octopus-deploy - 在 Octopus 步骤中下载包
- c# - C#调用本机方法而不为所需的结构参数分配内存
- python - 根据 Pandas Dataframe 中的时间戳列过滤给定的列(计数)
- flutter - 检查小部件字体、边距、填充和其他属性
- c# - 尝试...捕获 Items.GetByName(SeekedName) 与昂贵的每个 Items.Item 直到 CurrentItem.Name=SeekedName
- javascript - 根据值对二维数组进行排序
- python - 移动椭圆移动 QGraphicsScene 中的其他元素
- java - 读取外部应用程序属性中的 POM 值
- python - 有没有办法将 tkinter 输入框植入我的海龟屏幕(创建绘画)