2010-02-16 74 views
13

我有一个很基本的问题:类与接口

什么时候应该决定使用接口或类为特定的类?

例如:我们有2个班,客户和医生。

继承(class):我们可以设置这两个类从父类Person继承。

难道我们不能和Interface一样吗?说我们有InterfacePerson并且让Customer和Doctor都实现了这个接口?

因此,这导致:我们什么时候决定使用另一种,反之亦然?

回答

1

简单地说,你用的时候有代码/执行参与类,当它的接口只是界面描述。在引用代码中的对象时,更愿意引用接口,因为它可以更容易地替换实际的实现(或添加更多不同的实现)。

是的,Docor和客户/患者都可能实施或扩展Person。

13
  • 阅读wikipedia article

  • 读一本书,然后再阅读OOP章节

  • 在你的榜样,Person应该是一类,因为它包含实现细节是通用于DoctorCustomer

  • 接口没有(也不需要)实现细节 - 它们只表示什么实现它们的对象正在做什么。不是如何。为什么这很有用?因为当你使用的对象,你不在乎如何它将完成其工作。

让我们来看一个简单的例子 - 有一个接口Comparable(至少在Java中)。它的表示其实现者可以相互比较。所以,你可以有两类:

class Doctor implements Comparable {..} 

class Customer implements Comparable {..} 

现在你可以有一个共同方法,这需要任何一套实施Comparable和呼叫comparable1.compareTo(comparable2)对象的,因为你知道他们可以进行比较 - 这是由它们的接口表示。

0

在C#中,多继承可以通过接口来实现。 根据您的业务需求,如果您的类需要多个继承正在进行fwd,则使用Interface else使用class。

所有接口的成员都应该在类中定义,即接口成员是必须实现的成员。

0

类表明,它继承基类对象是某种这一类的

,如果你使用的界面那只能说明你的类有一个接口描述

1

父类的一些共同的行为就是其中一个会具有所有子类通用的最小属性。

但是Interface是一个合同,它告诉它的植入是否提供,如果它不是一个抽象类。

和A类和接口之间的一个重要区别是,

类继承会给两个共同的子类之间的关系。

作为接口实现给出两个不常见的类之间的关系。

2

首先要记住的是,类可以被实例化,接口不能。

其次,一个类只能扩展一个类。接口不受此限制,所以我们可以拥有多重继承,例如

public class foo extends Person implements Man, Mammal 

foo是Person。它也是一个男人和一个哺乳动物;

唯一的问题是接口不能具有作为类(或抽象类)的变量或方法实现。

通常我会说坚持接口,如果可以的话避免抽象类。

0

将界面视为合同。班级可能会承诺执行合同(实施界面)

假设您有具有子类Doctor和Patient的Person Person。然后,您可以使用由Patient实现的getSymptoms()方法实现界面Treatable,并使用Doctor实现的方法治疗(Treatable)进行治疗。最有可能治愈(可治疗)将在某个时候调用getSymptoms()...

10
  • 接口 - 描述的行为
  • 类 - 执行行为

延伸的另一类A类继承的行为。另一方面,实现一个接口只是说它需要以这种方式行事,但类仍然需要知道如何做。

除了单一的继承限制,使用接口的代码更容易重构和测试,例如,在单元测试中为数据库访问对象提供模拟实现。

所以,真正的答案是,它取决于你的设计。

它可能是您使用接口来描述行为和抽象父类来实现可以由子类继承的行为。或者,也许这些子类是如此不同以至于它们都以各自的方式实现接口。

2

在对象建模中,不应该为人员及其角色使用继承。应该用两个关联的对象来模拟它们。也就是说,使用组合而不是继承。

因此,在三种方法中,您将讨论两个错误的方法:为派对和角色建模的继承和接口。

一个类是一组对象的模板。这些对象具有行为,(通常)状态和特征。关于行为,每个对象都有一个(隐含的)接口已经:可以从外部调用的一组方法。

然后问题就出现了,为什么要创建一个名为的接口,接口的一个子集已经由一个对象提供了?

  1. 人们希望代表行为等不同类的对象可以多态进行治疗的子集
  2. 人们想限制一个对象暴露给另一个对象的可能行为,因为它的对象是在不同的上下文中操作的。