这只是为了我自己的知识。如果基类“A”实现了接口“I”,那么A的任何派生类(比如说B)也“是I”类型吗?换句话说,“是”关键字返回true?从B派生的C类怎么样?
问题是,一旦在基类中实现了一个接口,那个类(和派生类)是否属于该接口类型?有没有办法删除它所以“是”返回false?
答案 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)I
。C2
是C1
因此
C2
是C1
是(n)I