OOP接口和基类

时间:2014-03-21 20:13:56

标签: c# class oop inheritance interface

这只是为了我自己的知识。如果基类“A”实现了接口“I”,那么A的任何派生类(比如说B)也“是I”类型吗?换句话说,“是”关键字返回true?从B派生的C类怎么样?

问题是,一旦在基类中实现了一个接口,那个类(和派生类)是否属于该接口类型?有没有办法删除它所以“是”返回false?

4 个答案:

答案 0 :(得分:1)

是的,所有派生类都是其所有基本祖先的类型。

我不确定是否有办法去除"删除"基础实现 - 从未尝试过。这听起来像你的OOD在很大程度上被打破了。

你可以做的(并且再次,从未尝试过),是提供自己的转换转换,并在尝试转换为该基础/接口时始终返回null。不确定它是否可以做到这一点(通过反射访问时可能无法工作)。

答案 1 :(得分:1)

如果基类实现了接口,则所有派生类也将实现该接口。实际上,任何派生类也将实现接口的事实是面向对象编程的关键特性。 (见Liskov substitution principle

  

在基类中实现接口后,该类(和派生类)是否属于该接口类型?

  

任何方式将其删除所以"是"返回假?

没有

如果您需要扩展实现接口的类而不在新类中实现该接口,则解决方案是使用encapsulation。在新类中包装基类,并显式公开您希望允许访问的任何属性或方法。

答案 2 :(得分:1)

是的,与基础或接口相比,所有子类对is始终返回true。如果要检查对象是否属于特定类型,请使用

if (obj.GetType() == typeof(MyClassName))
{

}

如果你想检查一个非常特殊的继承点,就好像一个对象有一定的实现深度,但只是到目前为止,只需合并is这样的语句:

if (obj is FlyingThing && !(obj is Airplane))
{

}

答案 3 :(得分:1)

是。您可以将继承视为"是"关系。

class C1 : I {}
class C2 : C1 {}

可以理解为:

  

C1是(n)IC2C1

因此

  

C2C1是(n)I