【问题标题】:Inheritance design for having similar entities but with different properties具有相似实体但具有不同属性的继承设计
【发布时间】:2026-02-08 20:15:02
【问题描述】:

我正在设计几个视图,它们应该显示玩家及其属性的列表,但从不同的角度。

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

所有视图的共同点是NameExp - 所以将它们移到BaseView 是有意义的。另外,还有一个Skill,用于2/3视图,可能会在一些下一个视图中使用,所以它也可以移动到基础视图中。

问题是:

  • 如果在 BaseView 中呈现所有属性并在特定视图中使用它们 - 会不会违反 OOD?
  • 如果制作新的 BaseWithSkillView(显然会继承 BaseView 并实现 Skill 属性渲染) - 这不是不必要的实体吗?
  • (反问)如果将 NameExp 保留在 BaseView 中,并在 ViewA 和 ViewB 中重新实现 Skill 属性 - 这不是代码复制。

此案例的推荐做法是什么?

UPD:为了使问题更通用,假设我有 20 个属性和 10 个视图,每个视图都应该显示 7 个不同的属性。恐怕我最终会使用 BaseWithSkillExpHpManaBonusView。

【问题讨论】:

  • BaseView, => BaseWithSkill, => ViewA, ViewB; BaseView => ViewC
  • @ZoharPeled 感谢您的回答,我已经更新了问题。

标签: c# oop architecture


【解决方案1】:

如果您有 20 个属性和 10 个视图,并且每个视图应该显示 ~7 个不同的属性,我建议您使用装饰器模式。

http://www.dotnet-tricks.com/Tutorial/designpatterns/VRQT130713-Decorator-Design-Pattern---C

在这种情况下,您将拥有 IBaseView、BaseView、BaseViewDecorator、HealthDecorator : BaseViewDecorator 等。

【讨论】:

  • 是的,这听起来像是一个选项