具有相似实体但具有不同属性的继承设计
Inheritance design for having similar entities but with different properties
我正在设计几个视图,它们应该从不同的角度显示玩家列表及其属性。
ViewA shows player's: Name, Exp, Skill, Condition
ViewB shows player's: Name, Exp, Skill, Bonus
ViewC shows player's: Name, Exp, Price, Bid amount
所有视图的共同点是 Name
和 Exp
- 因此将它们移动到 BaseView 是有意义的。另外,还有一个Skill
,用在2/3视图中,可能会在下一个视图中使用,所以也可以移到基础视图中。
问题是:
- 如果让所有属性在 BaseView 中呈现并在特定视图中使用它们——这不会违反 OOD 吗?
- 如果创建新的 BaseWithSkillView(这显然会继承 BaseView 并实现
Skill
属性 渲染)- 它不是一个不必要的实体吗?
- (反问)如果在 BaseView 中保留
Name
和 Exp
并在 ViewA 和 ViewB 中重新实现 Skill
属性 - 不是吗代码复制。
对于这种情况,推荐的做法是什么?
UPD:为了让问题更通用,假设我有 20 个属性和 10 个视图,每个视图都应该显示 7 个不同的属性。恐怕我最终会得到 BaseWithSkillExpHpManaBonusView。
如果您有 20 个属性和 10 个视图,并且每个视图应显示 ~7 个不同的属性,我建议您使用装饰器模式。
http://www.dotnet-tricks.com/Tutorial/designpatterns/VRQT130713-Decorator-Design-Pattern---C
在这种情况下,您将拥有 IBaseView、BaseView、BaseViewDecorator、HealthDecorator : BaseViewDecorator 等。
我正在设计几个视图,它们应该从不同的角度显示玩家列表及其属性。
ViewA shows player's: Name, Exp, Skill, Condition
ViewB shows player's: Name, Exp, Skill, Bonus
ViewC shows player's: Name, Exp, Price, Bid amount
所有视图的共同点是 Name
和 Exp
- 因此将它们移动到 BaseView 是有意义的。另外,还有一个Skill
,用在2/3视图中,可能会在下一个视图中使用,所以也可以移到基础视图中。
问题是:
- 如果让所有属性在 BaseView 中呈现并在特定视图中使用它们——这不会违反 OOD 吗?
- 如果创建新的 BaseWithSkillView(这显然会继承 BaseView 并实现
Skill
属性 渲染)- 它不是一个不必要的实体吗? - (反问)如果在 BaseView 中保留
Name
和Exp
并在 ViewA 和 ViewB 中重新实现Skill
属性 - 不是吗代码复制。
对于这种情况,推荐的做法是什么?
UPD:为了让问题更通用,假设我有 20 个属性和 10 个视图,每个视图都应该显示 7 个不同的属性。恐怕我最终会得到 BaseWithSkillExpHpManaBonusView。
如果您有 20 个属性和 10 个视图,并且每个视图应显示 ~7 个不同的属性,我建议您使用装饰器模式。
http://www.dotnet-tricks.com/Tutorial/designpatterns/VRQT130713-Decorator-Design-Pattern---C
在这种情况下,您将拥有 IBaseView、BaseView、BaseViewDecorator、HealthDecorator : BaseViewDecorator 等。