接口类和抽象类之间有什么区别和相似之处?

时间:2010-06-13 05:42:07

标签: oop

  

可能重复:
  Interface vs Abstract Class (general OO)

接口类和抽象类之间有什么区别和相似之处?

我的意思是何时使用界面以及何时使用抽象类?在什么条件下适合使用另一种条件。

1 个答案:

答案 0 :(得分:3)

首先,界面不是类。接口不能指定功能,而只能指定所需的名称。

接口定义在从接口继承的任何类中必须公开可用的方法和属性。接口不包含任何实现代码,并且没有说明该类的任何非公共方面。接口不是一个类,而是更多的契约。

抽象类是一个真正的类。抽象类的唯一限制是它不能直接实例化。相反,您必须实例化一个继承自抽象类的子类。

至于何时使用它们,我会说当你的对象真正共享一个共同的祖先时,你应该考虑从一个抽象类继承。例如,如果'salesman'和'programmer'都继承自抽象的'employee'类,那将是合乎逻辑的。

如果您想知道类的公共接口是什么样的,但是您不需要它们在实现方面共享任何共性,那么接口很有用。例如,在C#中,任何实现IEnumerable接口的类都可以迭代,并且肯定会实现MoveNext和Current。这可以是类似列表或数组的集合,也可以是调用数据库或Web服务甚至生成随机数的生成器(状态机)。除了接口中指定的方法和属性的名称之外,IEnumerable的实现不需要共享任何公共代码。

值得注意的是,在C#中,您只能从单个类继承,但您可以根据需要实现任意数量的接口。此外,在C#界面中,按照惯例开始使用标题“I”,但严格来说,这不是必需的。