我基本上在Inherited类中定义了IFoo
两次。这会导致一些不可预见的后果吗?
interface IFoo {
...
}
interface IBar : IFoo {
...
}
class Base : IFoo {
...
}
class Derived : Base, IBar {
...
}
我希望IBar
继承自IFoo
的原因是,我可以Derived
处理IFoo
,而不必投射它。
if (Derived is IBar)
// Do work
如果它不继承我必须施放它。这使得使用更加复杂,并且班级用户可能不理解IBar
只是IFoo
的专业化。
if (Derived is IBar)
Derived as IFoo
// Do work
这是不好的做法吗?这个问题有什么其他解决方案?
答案 0 :(得分:5)
在代码术语中不会导致任何不可预见的情况。这只是多余的。
至于这段代码:
if (Derived is IBar)
Derived as IFoo
这是完全没必要的,因为Derived
是 IFoo
,给出了你的声明 - 所以不要这样做!
请注意,即使IBar
不是来自IFoo
,您仍然不需要Derived as IFoo
。给出:
interface IFoo {}
interface IBar {}
class Base : IFoo {}
class Derived : Base, IBar
{
}
然后编译好了:
var derived = new Derived();
IBar bar = derived; // Fine.
IFoo foo = derived; // Also fine.
答案 1 :(得分:1)
您可以明确定义Interface
的实现,从而区分行为
class Derived : Base, IBar {
void IBar.Method(){
}
void Base.Method() {
}
}
除此之外,您可以这样做,但它是多余的,可能会引起混淆。请参阅MSDN。
答案 2 :(得分:1)
如果我理解正确,你有一个接口层次结构和一个层次互相镜像的层次结构。每个类通过继承它的基类并实现所需的其他成员来实现相应的接口。
这很好,我也是这样做的。我不知道有什么更好的方法可以做到这一点 - 是一种很好的方法。
我认为IBar应该像你的主要建议一样扩展IFoo,否则消费者需要投入很多。此外,因为您认为IBar是IFoo的专业化,所以在代码中使其成为专业化,因此请将其扩展为IFoo。