【问题标题】:Class vs. Interface类与接口
【发布时间】:2011-01-17 06:50:38
【问题描述】:

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

我们应该什么时候决定对特定类使用接口或类?

例如:说我们有 2 个类,Customer 和 Doctor。

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

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

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

【问题讨论】:

    标签: c# java oop


    【解决方案1】:

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

    所以在某种程度上,在三种选择中,您讨论了两种错误的选择:用于建模方和角色的继承和接口。

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

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

    1. 人们想要表示行为的子集,以便可以多态地处理不同的对象。
    2. 希望将暴露给另一个对象的可能行为限制在其(隐式)接口的子集内,因为该对象在不同的​​上下文中运行。

    【讨论】:

      【解决方案2】:
      • 界面 - 描述行为
      • 类 - 执行行为

      扩展另一个类的类继承该行为。另一方面,实现一个接口只是说它需要以这种方式表现,但类仍然必须知道如何做。

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

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

      可能你使用接口来描述行为,而抽象父类来实现子类可以继承的行为。或者子类可能如此不同,以至于每个子类都以自己的方式实现接口。

      【讨论】:

        【解决方案3】:

        将接口视为合同。该类可能会提交合约(实现接口)

        假设你有一个 Person 类,它的子类是 Doctor 和 Patient。然后,您将使用 Patient 实现的方法 getSymptoms() 的接口 Treatable 和 Doctor 实现的方法cure(Treatable) 的接口 Treating。最有可能的治愈(可治疗)会在某个时候调用 getSymptoms() ...

        【讨论】:

          【解决方案4】:
          • 阅读wikipedia article

          • 读一本书,然后再读一遍关于OOP的章节

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

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

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

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

          现在您可以拥有一个 common 方法,该方法采用 任何一组对象,这些对象实现 Comparable 并调用 comparable1.compareTo(comparable2),因为 你知道 他们可以进行比较 - 由他们的界面表示

          【讨论】:

            【解决方案5】:

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

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

            public class foo extends Person implements Man, Mammal
            

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

            唯一的问题是接口不能有变量或方法实现,而类(或抽象类)可以。

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

            【讨论】:

              【解决方案6】:

              父类是具有所有子类共有的最低限度属性的类。

              但是接口是一个契约,如果它不是一个抽象类,它告诉它的植入提供。

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

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

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

              【讨论】:

                【解决方案7】:

                class 表明继承基类的对象是这个类的某种类型

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

                【讨论】:

                  【解决方案8】:

                  在 C# 中,只能通过接口实现多重继承。 根据您的业务需求,如果您的类需要多重继承,则使用接口,否则使用类。

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

                  【讨论】:

                    【解决方案9】:

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

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

                    【讨论】:

                      【解决方案10】:

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

                      类可用于继承/覆盖基本功能。

                      看看

                      【讨论】:

                        猜你喜欢
                        • 2016-03-24
                        • 1970-01-01
                        • 2015-01-25
                        • 2017-11-02
                        • 2010-12-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多