【问题标题】:Classes: Pass as argument or inherit?类:作为参数传递还是继承?
【发布时间】:2011-12-28 18:39:12
【问题描述】:

好吧,假设我有一个继承自 cOrganismcPlayer 类,该类继承自 cEntity。现在我已经准备好扩展我的cPlayer 类并且我想为我的播放器添加动画。会不会更好

A.) 创建一个cAnimation 类并让cPlayer 继承它?

B.) 创建一个cAnimation 类并将其作为参数传递给cPlayer

C.) 还有别的吗?

【问题讨论】:

  • 不要使用匈牙利符号。这是个坏主意。
  • @bames53:对琐碎的命名约定的含糊其辞的批评既不具建设性,也不适合这个问题。
  • @bames53 我向你保证,在我的任何程序中使用的唯一形式的匈牙利符号是用于我的课程。我的命名方法是我自己的,如果您在没有任何相关知识或任何理由不充分的情况下抨击它们,我将不胜感激。
  • @tenfour 这就是为什么我在评论中而不是在答案中说的原因。让人们知道匈牙利符号是一个坏主意很重要。
  • @NickSavage 我很高兴您没有在其他任何地方使用它。您的命名方法确实是您自己的,但我并不是专门抨击您的命名方案,我只是在抨击匈牙利符号。除了从您的问题中显而易见的内容外,我没有对您的计划做出任何假设。无论如何,我认为我的评论被夸大了。

标签: c++ class inheritance hierarchy


【解决方案1】:

这取决于CAnimation 的设计方式。通常,继承在父类和子类之间形成“实现”或“是”关系。

例如,cPlayer 应该继承 cAnimation 你想要的:

  • cPlayer 实现接口 cAnimation
  • cPlayer成为cAnimation

对我来说似乎都没有任何意义。 “cAnimation”不是你给界面起的那种名字,播放器也不是动画。

但这只是基于您的命名。您的实际设计将取决于控制动画的内容、动画与对象的交互方式(也许您需要IAnimatedObject 接口?)等之间的关系。

【讨论】:

  • 能否请您描述一下您对“接口”的使用情况?
  • 这主要是概念性的。这个想法是接口只描述了如何与对象交互——通常 C++ 中的接口只包含纯虚方法,接口本身没有实现。 IAnimatedObject 可能有 { virtual void Render() = 0; virtual void UpdateFrame() = 0; }。实际上,这是唯一的区别。查看this question 了解更多关于 C++ 接口的信息。
【解决方案2】:

我会使用组合:将cAnimation 类型的对象作为cPlayer 的成员。这里的许多问题都与这个问题有关(继承与多态性)。一个很好的答案是here

【讨论】:

    【解决方案3】:

    我宁愿认为一个假设的cAnimation 类将包含,例如,一系列骨骼位置,并且cPlayer 可能有多个可能的动画(步行、跑步、跳跃等),因此cAnimations 的集合将是 cPlayer 的成员。

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 2018-05-25
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      相关资源
      最近更新 更多