[英]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(){
}
}
通过我的理解,我将以此方式解释一些关于接口和抽象差异的方法。 但是我想知道如何回答以下两个问题:
您不能实例化一个抽象类,那么如果您将男人和女人设为抽象,那么如何实例化这些类。 那怎么有什么用呢?
为什么将男人和女人抽象化,为什么不能仅仅将它们作为界面。 类将实现它们而不是扩展。
这些是我问自己的问题。 我可能在这里错过了一些东西。 欣赏此示例中的见解。
界面是与外界的契约,您最好面对。 在某种程度上,它还允许您在Java中实现多重继承。
那里有一个抽象类来提供一组通用的功能,这些功能可以由其所有子类(例如属性,字段等)共享。
现在,让我们看一下您在帖子中提供的示例。
我想引用此链接的评论: 抽象类和接口之间有什么区别?
类定义什么,接口定义什么可以做什么
牢记这个概念,男人和女人定义了人的全部含义。 而职业只是一个人的特征,对性别保持中立。 这就是将其作为接口的原因。
现在对您的问题:
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.