类与接口

我有一个非常基本的问题:

我们什么时候应该决定为特定类使用Interface还是Class?

例如:说我们有2个class,客户和博士。

在inheritance(类)中:我们可以将这两个类设置为从父类Personinheritance。

我们不能对Interface做同样的事情吗? 说我们有InterfacePerson并且Customer和Doctor都实现了接口吗?

因此,这导致:我们何时决定使用一个而不是另一个,反之亦然?

  • 阅读维基百科文章

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

  • 在您的示例中, Person应该是一个类,因为它包含DoctorCustomer共有的实现细节

  • 接口没有(也不需要)实现细节 – 它们只表示实现它们的对象正在做什么。 不怎么 。 为什么这有用? 因为当你使用这个对象时,你并不关心它是如何完成它的工作的。

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

 class Doctor implements Comparable {..} class Customer implements Comparable {..} 

现在你可以有一个通用方法,它接受任何实现Comparable 的对象并调用comparable1.compareTo(comparable2) ,因为你知道它们可以执行比较 – 它由它们的接口表示

  • 界面 – 描述行为
  • 类 – 做行为

扩展另一个类的类inheritance该行为。 另一方面,实现一个接口只是说它需要表现那样,但是类仍然需要知道如何操作。

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

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

可能是您使用接口来描述行为,并使用抽象父类来实现子类可以inheritance的行为。 或者子类是如此不同,每个子类都以自己的方式实现接口。

接口用于强制执行某些方法/属性。 简而言之,界面是一组规则。

类可用于inheritance/覆盖基本function。

看一下

  • C#中的类和接口之间的区别?
  • C#:接口与类
  • 抽象类与接口
  • 接口(C#参考)

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

其次,Class只能扩展一个Class。 接口不受此限制,因此我们可以像这样进行多重inheritance

 public class foo extends Person implements Man, Mammal 

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

唯一的问题是Interfaces不能有变量或方法实现,作为一个类(或那个问题的抽象类)可以。

一般来说,如果可以的话,我会坚持使用接口并避免使用抽象类。

在对象建模中,不应该为人员及其角色使用inheritance。 应该用两个相关对象对它们进行建模。 也就是说,使用组合而不是inheritance。

所以在某种程度上,有三种选择,你讨论两个错误的:inheritance和接口,用于建模各方和角色。

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

那么问题就变成了,为什么要创建一个命名接口,一个对象已经提供的接口的子集?

  1. 人们想要表示行为的子集 ,因此可以多态地处理不同类别的对象。
  2. 人们希望将暴露给另一个对象的对象的可能行为约束到其(隐式)接口的子集,因为该对象在不同的​​上下文中起作用。

简而言之,当涉及代码/实现时使用类,而当它只是接口描述时使用接口。 在引用代码中的对象时,更喜欢引用接口,因为它可以更容易地替换实际的实现(或者添加更多不同的实现)。

是的,Docor和Customer / Patient都可能实施或扩展Person。

父类是具有其所有子类共有的最小属性的类。

但是Interface是一个契约,它告诉它的植入提供它是否不是一个抽象类。

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

类inheritance将给出两个公共子类之间的关系。

其中Interface实现给出了两个不常见的类之间的关系。

在C#中,只能通过Interface获得多重inheritance。 根据您的业务需求,如果您的类需要多inheritancefwd,那么使用Interface else use class。

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

class建议inheritance基类的对象是这种类的某种

如果你使用接口,它只显示你的类有一些接口描述的常见行为

将接口视为合同。 该类可以承诺合同(实现接口)

假设您有类具有子类医生和患者的人员。 然后,您将使用由Patient实现的方法getSymptoms()和使用Doctor实现的接口治疗方法治疗(可治疗)接口。 最有可能治愈(可治疗)会在某个时候调用getSymptoms()……