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

本文关键字:定义 接口 继承 | 更新日期: 2023-09-27 18:18:55

实际上我在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

这种做法不好吗?这个问题还有其他的解决办法吗?

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

在代码术语中不会造成任何不可预见的情况。这是多余的。

对于这段代码:

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 
{
}

然后编译ok:

var derived = new Derived();
IBar bar = derived; // Fine.
IFoo foo = derived; // Also fine.

如果我理解正确的话,你有一个接口层次结构和一个相互镜像的类层次结构。每个类通过继承其基类并实现所需的附加成员来实现相应的接口。

这很好,我用同样的方法来做。我不知道有什么更好的方法来做到这一点——这个一个很好的方法。

我认为IBar应该像你的主要建议那样扩展IFoo,否则消费者需要投很多钱。此外,既然您认为IBar是IFoo的专门化,那么也可以在代码中将其作为专门化,因此让它扩展IFoo。

您可以显式定义Interface的实现,以便区分行为

class Derived : Base, IBar {
    void IBar.Method(){
    }
    void Base.Method() {
    }
}

除此之外,您可以这样做,但这是多余的,可能会引起混淆。看到MSDN。