我搜索了大量的S / O帖子,并没有找到帮助我的答案 我想要了解什么是抽象类以及什么是接口。我已经阅读了这篇文章Real world abstract class usage simple samples,但我仍然不清楚这些概念。
我希望有人可以用“人物”对象的形式描述一个真实的世界。
所以继承将是“人” - > “员工” - > “经理人”
最重要的是“员工薪酬”将成为“销售员工佣金”
如何在Person对象概念中描述抽象类和接口?
答案 0 :(得分:9)
关于使用接口与抽象类的主题有不同的看法。但是,接口应该表示对象的行为(它可以做什么),而抽象类应该定义它是什么。从对象的角度来看,基本上“我能”与“我是”。
所以,如果我们有一个Person,那就是一个名词,所以我们将使用一个抽象类来定义它。任何“是”人物都将从该类继承。如果我们想要定义一些行为来描述Person能够不能扩展到所有人的行为,我们应该将它放到一个接口中。
使用您定义的关系(Person - > Employee - > Manager),我们可以说Employee实现了IFirable,而Manager实现了IFirer。员工可以解雇,经理可以解雇员工。
答案 1 :(得分:4)
我很抱歉我没有使用您的人员示例,请将此作为扩展评论。
我觉得最简单的解释概念,对没有编程背景的人,使用类比大多数人已经理解的东西:塑料成型!
让我们说我们正在制作塑料水果,例如:
界面就像模具一样,它具有最终产品的形状,但你可以用各种不同的颜色和材料填充它。它们最终都具有相同的形状,即使它们的颜色和纹理完全不同。
抽象类更像是需要额外步骤的东西,比如绘画。你制作了基本的塑料水果,然后把它送去粘上一些油漆或毛皮或其他东西。
未完成的水果就像一个抽象的类,因为它对模具的最终产品有更多的定义,但它本身并不完整。它需要完成更多工作,最终产品可能是完全不同的颜色,但它们仍然基本相同。
我希望有所帮助!
答案 2 :(得分:4)
好的,让我们看看我是否理解你的问题......
我认为您对接口和抽象类的使用之间的差异和/或相似性存在概念性的不确定性。如果这就是问题那么继承人我的“10人入门”总结;
抽象类无法实例化,但可以包含实现细节,因此在从一个类派生类时,您将获得合同以及您在抽象类中放置的任何默认行为。例如,你的Person类(我假设它是这个例子的抽象类)将定义派生的Employee或Manager类必须(至少)具有的契约,但也可以提供一些默认行为。
另一方面,接口仅指定合同;实施课必须做什么,他们不能提供任何实施方式。例如,如果您的示例中的“Person”实际上是一个接口,那么它将定义实现它的类(Employee和Manager)必须执行的操作,但不能为该合同提供任何默认实现。
另请注意,在许多语言(Java,C#,Delphi)中,您只能从一个父类继承,但可以实现许多接口。