繁体   English   中英

我对何时使用Abstract类或接口的理解

[英]My understanding of when to use Abstract class or Interface

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

我的例子与人类有关。 一个人可以是男人或女人。 一个人在生活中可以有不同的职业。 因此,我如何使用它们:

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

Interface SoftwareEngineer{
 code();
}

Interface TruckDriver{
 driveTruck();
}

Interface Pilot{
 flyPlane(); 
}

我将男人和女人声明为抽象类-因为男人和女人会成为那个人。

Abstract Man{

}

Abstract Woman{

}

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

Class Mark extends Man, Implements SoftwareEngineer{

  code(){

  }
}

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

  1. 您不能实例化一个抽象类,那么如果您将男人和女人设为抽象,那么如何实例化这些类。 那怎么有什么用呢?

  2. 为什么将男人和女人抽象化,为什么不能仅仅将它们作为界面。 类将实现它们而不是扩展。

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

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

那里有一个抽象类来提供一组通用的功能,这些功能可以由其所有子类(例如属性,字段等)共享。

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

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

我想引用此链接的评论: 抽象类和接口之间有什么区别?

类定义什么,接口定义什么可以做什么

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

现在对您的问题:

1.您无法实例化一个抽象类,那么如果您将男人和女人设为抽象,那么如何实例化这些类。 那它有什么用呢?

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

2.为什么将男人和女人抽象化,为什么不能仅仅将它们作为界面。 类将实现它们而不是扩展?

仅仅因为男人或女人不仅是一个特征,它还将在派生类中定义很多组成。 其次,由于接口特别关注特性,因此语言允许从接口进行多重继承。 一个人不能同时是男人和女人。

概括起来,只要您打算覆盖派生类的所有方面,就可以定义一个Abstract类。 以及仅适用于可能由许多不同类型共享的特征的接口。 例如,所有可读取对象的IRead接口。 现在,阅读不仅适用于男人或女人,还可以扩展到小工具。

这种情况通常会出现在Startegy设计模式下。 (建议为男人和女人的抽象子类使用通用的抽象基类)。 切勿使用任何具体的基类。

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

一次假设一个专业的策略模式( 对于多个专业,我们将同时需要修改模式Impl )将使用人员类别(M / W)作为上下文,而使用Professor / SoftwareEngineer作为具体策略。 问题不止于此,它将因国家的不同而对不同的职业带来不同的收入挑战。 但是,可以通过使用策略作为基本模式来解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM