类之间的关系叫继承(我这里不讨论组合)。而类和接口之间的关系叫实现。
类可以实现多个接口,但是只能继承一个类(这里不讨论C#以外的其他语言。)
父类(或基类)的成员如果标记为private,那么只有该类本身可以访问。
如果标记为protected,那么其本身以及继承了该类的类都可以访问。public和internal我不讨论。
如果该方法标记为virtual(虚方法),那么继承了该类的子类(或派生类)可以重写这个方法“override”,这叫多态。如果没有标记为virtual,那么子类中同名的方法将覆盖掉父类中的同名方法(默认情况下等同于在子类中使用new关键字)。这里我并没有完完全全的解释,这是个初级程序员面试经常碰到的题。
如果说virtual的含义是允许子类重写,那么abstract修饰的方法就是说子类必须重写。所以被abstract修饰的方法是没有方法体的。只有方法的签名(方法的返回值,方法名,方法的参数列表)。
如果一个类中有方法声明为abstract,那么该类也必须声明为abstract。而且该类型将不能直接实例化,但这并不是说该类型不允许写构造函数。
终于说到接口(interface)了,从技术上说,如果一个类全都是抽象方法,那么它就是个接口了。但是这种表述非常随意。严格的说,接口之所以可以被多重“继承”,是因为接口事实上不是类的继承层次,而是一种契约。
比方说一个人类(People),当它实现了Walkable接口的时候,它就可以走了,当它实现了Runable接口的时候,它就可以跑了,如果它实现了Flyable接口的时候,它甚至可以飞了(天使?鸟人?)。
在比方说,门(Door)这个类,当它实现了Lockable,他就是可以锁住的门。如果他实现了Revolvable,那么它是一扇转门。如果它实现了Slidable,那么这是一扇滑动门。
-----------------
纠正一下楼上的一些说法:
1.接口不是必须以I开头。这只是一种常见的命名规范。接口通常描述一个行为。比如Lock/Unlock, Compare, Clone。所以很多接口以able结尾表述一种能力。
2.子类继承父类,拥有父类的字段和方法。
特例:private的成员;标记为sealed的方法。
还有一样东西,Attribute,这个要根据具体的Attribute是否允许被继承而定。
3.接口是比抽象类更“纯”的类,接口中不能包含字段。
接口不是类,但是更抽象。接口中不能包含字段(Field)、内部类(Nested Types)、委托(Delegate,但是可以包含事件)。所有的方法没有方法体和访问修饰符。
4.接口和类的关系是实现,不是继承。
5.(派生类继承抽象类时必须重写基类的所有抽象方法。)
派生类继承抽象类不必“重写”所有抽象方法。因为该派生类如果也是个抽象类,那么他很可能将这个类继续抽象到下面去。
另外,接口是可以继承的。
例子:IList继承自ICollection,ICollection继承自IEnumerable。
6.抽象类中含有虚方法。
抽象类和虚方法没有什么关系。含有抽象方法的类必须标记为抽象类。但是抽象类中也可能都是实体方法。
温馨提示:答案为网友推荐,仅供参考