我希望验证我对何时/为何使用抽象或接口的理解。
我的例子与人类有关。人类可以是男人或女人。人类在生活中可以有不同的职业。这就是我如何使用它们:
我会将这些职业宣布为界面,因为它将建立一个人类在该职业中可以做什么的合同。例如:
Interface SoftwareEngineer{
code();
}
Interface TruckDriver{
driveTruck();
}
Interface Pilot{
flyPlane();
}
我会宣称男人和女人是抽象的阶级 - 因为男人和女人都会成为那个人。
Abstract Man{
}
Abstract Woman{
}
用于定义一个人的类可以实现专业界面来定义该人可以做什么,并且该人将扩展抽象类来定义他/她是谁。
Class Mark extends Man, Implements SoftwareEngineer{
code(){
}
}
我将如何解释一些关于界面和抽象差异的理解。但我想知道如何回答以下两个问题:
你不能实例化一个抽象类,那么如果你把男人和女人当作抽象,那么你如何实例化这些类。那怎么可能有用呢?
你为什么要把男人和女人抽象化,为什么你不能把它们当成一个界面。类将实现它们而不是扩展。
这些是我问自己的问题。我可能会在这里遗漏一些东西。欣赏这个例子中的见解。
答案 0 :(得分:1)
界面是与外界的合约,是您最好的面子。在某种程度上,它还允许您在Java中实现多重继承。
抽象类提供了一组可以由其所有子类共享的通用功能,例如属性,字段等。
现在,让我们回顾一下您在帖子中提供的示例。
答案 1 :(得分:1)
我想引用此链接的评论:What's the difference between an abstract class and an interface?
类定义了什么,接口定义了什么可以做什么
记住这个概念,男人和女人定义了人的一切。而职业只是一个人的特征,对性别持中立态度。这就是将其作为界面的原因。
现在回答你的问题:
<强> 1。你不能实例化一个抽象类,那么如果你把男人和女人当成抽象,那么你如何实例化这些类。那怎么可能有用呢?
如果你要创造一个新人,这些抽象的课程将会有所帮助,Sam说。山姆会有不同的行为。因此,通过一个抽象的课程“人类”来实现这一目标。您可以向Sam添加更多详细信息,同时保留“男人”所需的基本最低详细信息。事实上,根据Abstract类的定义,您可能会为其某些(Man)函数实现默认功能,您可以为派生类(Sam)覆盖这些功能。注意,接口根本不具备任何功能,它们定义的只是结构。我建议你把人类想象成一个抽象的阶级。
<强> 2。你为什么要把男人和女人抽象化,为什么你不能把它们作为一个界面。类会实现它们而不是扩展吗?
仅仅因为男人或女人不仅仅是一个特征,而且它将在派生类中定义大部分组合。其次,由于接口特别关注特性,语言允许从接口进行多重继承。而一个人不能同时成为男人和女人。
总结一下,只要您的意图主要涵盖派生类的所有方面,就可以定义一个Abstract类。以及可能由许多不同类型共享的特征的接口。例如,可以读取所有那些对象的IRead接口。现在阅读不仅适用于男性或女性,它也可以扩展到小工具。
答案 2 :(得分:0)
此案例通常属于Startegy设计模式。 (建议有抽象子类Man / Woman的共同抽象基类)。切勿使用任何具体的基类。
在您的示例中,SoftwareEngineer(类的名称不能是 Mark 因为它可以是该类的对象)在运行时永远不会成为教授。实际上马克可以成为,对吧?
一次假设一个职业的战略模式(同时我们需要修改模式Impl 的)将使用Human类(M / W)作为上下文,教授/ SoftwareEngineer为具体的战略。问题并没有在这里结束,它会因不同的职业而对不同的收入产生新的挑战,因为它会要求国家改变。但是使用策略作为基本模式可以解决问题。