我对何时使用抽象类有疑问,如果我需要始终编写接口代码。一个例子:
我将拥有一系列自定义实体,并且所有这些实体都需要实现SomeMethod(),并且大多数需要实现AnotherMethod()方法。
SomeMethod()将是特定于实体的,每个实体将具有不同的代码。
AnotherMethod()由大多数人实现,但不是全部,并且代码对所有人都是相同的。
这是如何建模的?我的想法是每个新实体必须实现SomeMethod()并且能够使用AnotherMethod()。
谢谢, 戈兰
答案 0 :(得分:3)
AnotherMethod应该可以在抽象类中实现,这样就不会在整个地方重复代码。
如果SomeMethod是相关的功能,它可以在没有实现的情况下保留在同一个抽象类中,从而迫使孩子们实现它。如果该功能与AnotherMethod无关,则可以将其放在自己的界面中。
答案 1 :(得分:1)
你是对的,对于SomeMethod()
,使用抽象父类和抽象方法是一个好主意。您还可以使用接口,具体取决于方法的含义。例如,如果不同的类代表不同的动物并且方法是Move(Coordinate destination)
,则抽象父类更好。另一方面,如果不同的类没有任何共同点,并且方法是SerializeToJSON()
,那么最好使用接口。
如果某些类实现AnotherMethod()
,则可以再次使用抽象父类(使用非抽象的protected / public方法)。当然,不要从这个父类继承那些不必实现AnotherMethod()
。
答案 2 :(得分:0)
接口和抽象类之间的一个很大区别是抽象类可以有一些实现,其中接口严格地是契约和数据类型。在您给出的示例中,您可以使用接口来要求同时实现SomeMethod和AnotherMethod,但是您无法为AnotherMethod编写任何代码,因为接口只有方法签名。
在抽象类中,你可以将SomeMethod定义为抽象,因此需要从继承它的类中实现,但是你也可以创建AnotherMethod的实现并且只有一个implmentation,因为你说它对于很多都是相同的你的班级。
答案 3 :(得分:0)
考虑替换inheritance with aggregation的好情况。
我将AnotherMethod()
提取到其他类,例如AnotherMethodRunner
,并将getAnotherMethodRunner()
添加到基本接口。如果AnotherMethod()
是 派生类的属性,它将有一个,如果不是 - 它将返回null
或Null对象。
我个人通常采用非空的抽象基类作为对更精确的接口提取的调用。