接口作为功能或接口作为类型

Bai*_*ang 11 language-agnostic oop interface

假设我有这样的要求:
系统中的对象都派生自一个名为IObject的基类,它可能包含带颜色的对象,带有转换的对象,以及两者.

现在有两种方法来设计类层次结构.
第一个是:

只是让具体类派生自IObject,并选择"capability"接口作为其基类来表示它支持这样的行为,如interface:IHasColor,
IHasTransformation

第二个是:

组织基类,并从其中一个派生出具体类:IObject,IColorObject,ITransfromationObject,IColorAndTransformationObject

我更喜欢第一个(它有一个正式的名字?)因为它更灵活,你可以看到第二个可能有类组合爆炸问题,当有许多属性,如颜色,转换...

我想知道你的想法和建议.

谢谢.

Jor*_*oba 10

类抽象对象类型的真实概念.

接口抽象出对象行为或能力的真实概念.

那么问题变成了,"颜色"是对象的属性还是对象的能力?

当您设计层次结构时,您将世界限制在更狭窄的空间中.如果将颜色作为对象的属性,那么您将拥有两种对象,即具有颜色的对象和不具有颜色的对象.这适合你的"世界"吗?

如果你把它建模为一个功能(接口),那么你将拥有能够为世界提供颜色的对象,比如演员.

对于转换,适用相同的逻辑.你可以将世界分成两种对象,即可以变换的对象和不能变换的对象,或者你可以将它视为一种能力,一个对象可能有能力将自己转化为另一种东西.

对我来说,从这个角度来看,有意义的是:

  • 颜色是对象的属性.实际上每个物体都应该有一种颜色,即使它是透明的,即使它是反射的,即使它是"无"(祝你好运找出一个有颜色的对象=无物在现实世界中的意思,仍然可能在你的程序逻辑).
  • 转换是一种能力,即接口,对象能够做的事情,以及对象可能或可能不能做的事情.