【发布时间】:2011-01-17 06:50:38
【问题描述】:
我有一个非常基本的问题:
我们应该什么时候决定对特定类使用接口或类?
例如:说我们有 2 个类,Customer 和 Doctor。
在继承(类)中:我们可以将这两个类设置为从父类Person继承。
我们不能对接口做同样的事情吗?说我们有 InterfacePerson 并且让 Customer 和 Doctor 都实现了这个接口?
因此,这导致:我们什么时候决定使用一个而不是另一个,反之亦然?
【问题讨论】:
我有一个非常基本的问题:
我们应该什么时候决定对特定类使用接口或类?
例如:说我们有 2 个类,Customer 和 Doctor。
在继承(类)中:我们可以将这两个类设置为从父类Person继承。
我们不能对接口做同样的事情吗?说我们有 InterfacePerson 并且让 Customer 和 Doctor 都实现了这个接口?
因此,这导致:我们什么时候决定使用一个而不是另一个,反之亦然?
【问题讨论】:
在对象建模中,不应为人员及其角色使用继承。相反,应该使用两个关联的对象对它们进行建模。也就是说,使用组合而不是继承。
所以在某种程度上,在三种选择中,您讨论了两种错误的选择:用于建模方和角色的继承和接口。
类是一组对象的模板。这些对象具有行为、(通常是)状态和特征。关于行为,每个对象都有一个(隐式)接口 已经:可以在外部调用的方法集。
那么问题就变成了,为什么要创建一个命名的接口,一个对象已经提供的接口的子集?
【讨论】:
扩展另一个类的类继承该行为。另一方面,实现一个接口只是说它需要以这种方式表现,但类仍然必须知道如何做。
除了单一继承的限制,使用接口的代码更容易重构和测试,例如在单元测试中为数据库访问对象提供模拟实现。
所以,真正的答案是,这取决于您的设计。
可能你使用接口来描述行为,而抽象父类来实现子类可以继承的行为。或者子类可能如此不同,以至于每个子类都以自己的方式实现接口。
【讨论】:
将接口视为合同。该类可能会提交合约(实现接口)
假设你有一个 Person 类,它的子类是 Doctor 和 Patient。然后,您将使用 Patient 实现的方法 getSymptoms() 的接口 Treatable 和 Doctor 实现的方法cure(Treatable) 的接口 Treating。最有可能的治愈(可治疗)会在某个时候调用 getSymptoms() ...
【讨论】:
读一本书,然后再读一遍关于OOP的章节
在您的示例中,Person 应该是一个类,因为它包含Doctor 和Customer 共有的实现细节。
接口没有(也不需要)实现细节——它们只表示实现它们的what对象正在做什么。不是如何。为什么这很有用?因为当您使用该对象时,您并不关心它如何完成它的工作。
让我们看一个简单的例子——有一个接口Comparable(至少在Java中)。它表示它的实现者可以相互比较。所以你可以有两个类:
class Doctor implements Comparable {..}
class Customer implements Comparable {..}
现在您可以拥有一个 common 方法,该方法采用 任何一组对象,这些对象实现 Comparable 并调用 comparable1.compareTo(comparable2),因为 你知道 他们可以进行比较 - 由他们的界面表示。
【讨论】:
首先要记住,类可以实例化,接口不能。
其次,一个类只能扩展一个类。接口不受此限制,因此我们可以像这样进行多重继承
public class foo extends Person implements Man, Mammal
foo 是一个人。它也是一个人和一个哺乳动物;
唯一的问题是接口不能有变量或方法实现,而类(或抽象类)可以。
一般来说,如果可以的话,我会说坚持使用接口并避免使用抽象类。
【讨论】:
父类是具有所有子类共有的最低限度属性的类。
但是接口是一个契约,如果它不是一个抽象类,它告诉它的植入提供。
类和接口之间的一个重要区别是
类继承将给出两个公共子类之间的关系。
接口实现给出了两个不常见的类之间的关系。
【讨论】:
class 表明继承基类的对象是这个类的某种类型
如果你使用接口,它只表明你的类有一些接口描述的常见行为
【讨论】:
在 C# 中,只能通过接口实现多重继承。 根据您的业务需求,如果您的类需要多重继承,则使用接口,否则使用类。
接口的所有成员也应该在类中给出定义,即接口成员是必须实现的成员。
【讨论】:
简单地说,当涉及代码/实现时,您使用类,而当它只是接口描述时,您使用接口。在代码中引用对象时,更喜欢引用接口,因为这样更容易替换实际的实现(或添加更多不同的实现)。
是的,Docor 和 Customer/Patient 都可能实现或扩展 Person。
【讨论】:
接口用于强制执行某些方法/属性。简而言之,接口就是一组规则。
类可用于继承/覆盖基本功能。
看看
【讨论】: