建模问题(界面与抽象类)

时间:2011-03-01 16:34:09

标签: c# design-patterns domain-driven-design

我对何时使用抽象类有疑问,如果我需要始终编写接口代码。一个例子:

我将拥有一系列自定义实体,并且所有这些实体都需要实现SomeMethod(),并且大多数需要实现AnotherMethod()方法。

  • SomeMethod()将是特定于实体的,每个实体将具有不同的代码。

  • AnotherMethod()由大多数人实现,但不是全部,并且代码对所有人都是相同的。

这是如何建模的?我的想法是每个新实体必须实现SomeMethod()并且能够使用AnotherMethod()。

谢谢, 戈兰

4 个答案:

答案 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对象。

我个人通常采用非空的抽象基类作为对更精确的接口提取的调用。