在继承的类上多次定义接口

时间:2013-06-18 09:45:52

标签: c# inheritance interface

我基本上在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

这是不好的做法吗?这个问题有什么其他解决方案?

3 个答案:

答案 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。