【问题标题】:My understanding of when to use Abstract class or Interface我对何时使用抽象类或接口的理解
【发布时间】:2018-02-20 10:39:42
【问题描述】:

我希望验证我对何时/为什么使用抽象或接口的理解。

我的例子与人类有关。人类可以是男人或女人。一个人在生活中可以有不同的职业。所以这就是我使用它们的方式:

我将这些职业声明为界面,因为它将建立人类在该职业中可以做什么的合同。示例:

Interface SoftwareEngineer{
 code();
}

Interface TruckDriver{
 driveTruck();
}

Interface Pilot{
 flyPlane(); 
}

我将把男人和女人宣布为抽象类——因为男人和女人会决定这个人是谁。

Abstract Man{

}

Abstract Woman{

}

用于定义人的类可以实现职业接口来定义人可以做什么,人将扩展抽象类来定义他/她是谁。

Class Mark extends Man, Implements SoftwareEngineer{

  code(){

  }
}

根据我的理解,这就是我将如何解释一些关于接口和抽象差异的方法。但我想知道如何回答以下两个问题:

  1. 你不能实例化一个抽象类,那么如果你把男人和女人当成抽象的,你怎么能实例化这些类。那怎么可能有用呢?

  2. 你为什么要把 Man 和 Woman 抽象化,你为什么不能把它们作为一个界面。类将实现它们而不是扩展。

这些是我问自己的问题。我可能在这里遗漏了一些东西。欣赏此示例中的见解。

【问题讨论】:

  • 为什么Man 是一个抽象类? ManWoman 应该是具体的类。 Mark 不应该是一个;而Human 应该有一个name 字段,而Maninstance 应该有一个名称"Mark"
  • 谢谢...我试图看看我是否可以在我的示例中使用任何抽象类,所以我使用了 Man。但是,正如您解释的那样,这似乎没有意义。我可以在示例中引入任何可以解释某人的抽象类吗?
  • 我觉得你的声明是错误的。让我们以一个现实世界的场景为例,你不能说ManWoman 是未完成的事情,就像human。你可以有Human,因为抽象的男人和女人可以扩展
  • 这个链接可以给你一些想法:stackoverflow.com/questions/16781329/…
  • 你的意思是 Humans 可以是抽象类,Man 和 Woman 可以是具体类?

标签: java oop interface abstract-class


【解决方案1】:

我想引用这个链接的评论:What's the difference between an abstract class and an interface?

类定义事物是什么,接口定义事物可以做什么

牢记这一概念,男人和女人定义了人的全部意义。而职业只是一个人的特征,对性别是中立的。这就是将其作为接口的原因。

现在回答你的问题:

1.你不能实例化一个抽象类,那么如果你让男人和女人抽象,那么你怎么能实例化这些类。那它有什么用呢?

如果您要创建一个新人,这些抽象类将很有帮助,Sam 说。 Sam 会有不同的行为。因此,通过拥有一个抽象类“Man”,您可以向 Sam 添加更多细节,同时保持“Man”所需的基本最低细节。事实上,根据抽象类的定义,您可能为它的某些(Man)函数实现了默认功能,当然您可以为派生类(Sam)覆盖这些功能。注意,接口根本不能有任何功能,它们定义的只是结构。我建议您将 Human 视为一个抽象类。

2。为什么你把 Man 和 Woman 抽象化,你为什么不能把它们作为一个界面。类将实现它们而不是扩展?

仅仅是因为男人或女人不仅仅是一个特征,而且它会定义派生类中的大部分组合。其次,由于接口特别关注某个特性,语言允许从接口进行多重继承。而一个人不可能同时是男人和女人。

总而言之,只要您打算在很大程度上涵盖派生类的所有方面,就可以定义一个抽象类。以及可能由许多不同类型共享的特征的接口。例如,所有可以读取的对象的 IRead 接口。现在阅读不仅适用于男人或女人,它也可以扩展到小工具。

【讨论】:

    【解决方案2】:

    接口是与外界的契约,是你最好的一面。在某种程度上,它还允许您在 Java 中实现多重继承。

    abstract 类提供一组通用功能,可供其所有子类共享,例如属性、字段等。

    现在,让我们回顾一下您在帖子中提供的示例。

    1. ManWoman 如果一个男人或女人的实例可以在没有职业的情况下存在,则不需要是抽象类。因此,它们可以是具体的类。
    2. 您也不希望 ManWoman 成为接口。这将避免一个类同时实现 ManWoman 接口。
    3. 作为抽象类,ManWoman 类可以提供一组通用的功能。
    4. 名为 Mark 的类不适合用于扩展 Man 并实现 SoftwareEngineer 的具体类。 ManSoftwareEngineer 可能是一个更好的名字(我知道这是主观的)。但是,MarkManSoftwareEngineer 实例的好名字

    【讨论】:

      【解决方案3】:

      这种情况通常属于 Startegy 设计模式。 (建议为抽象子类男人/女人提供通用抽象基类)。永远不要使用任何具体的基类。

      在您的示例中,SoftwareEngineer(类的名称不能是 Mark,因为它可以是该类的对象)永远不能在运行时成为教授。实际上,马克可以成为,对吧?

      一次假设一个职业的策略模式(同时对于多个职业,我们需要修改模式 Impl)将使用 Human class (M/W) 作为上下文,Professor/SoftwareEngineer 作为一般的具体策略。问题并没有就此结束,它会因不同的职业而产生新的关于不同收入的挑战,因为它会要求改变状态。但是问题可以通过使用策略作为基本模式来解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-16
        • 2010-11-16
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        相关资源
        最近更新 更多