【问题标题】:Design decision - inheritance with delegation设计决策——带委托的继承
【发布时间】:2012-08-09 21:08:38
【问题描述】:

我有以下对象模型:

class CheckoutAd{
  int AdId;
  int ImpressionCap;
  int ClickCap;
  int ConversionCap;
  // ...
}

class SiteAd{
  int AdId;
  int ImpressionCap;
  int ClickCap;
  //...
}

如您所见,有重复的代码。所以我决定把重复的代码放在一个基类中,并从基类扩展上述类,如下所示:

class BaseAd{
   int AdId;
   int ImpressionCap;
   int ClickCap;
} 

但后来我想到将来会有一个 MobileAd 类,这个基类可能不是一个好的候选者,然后我不得不改变它。

我应该委托这些属性吗?

你会怎么做?

我应该使用策略模式吗?我将如何委派这种行为?

【问题讨论】:

  • 顺便说一句,我认为您应该分享一些有关您的意图的更多信息。这将使回答这个问题更容易一些。
  • 我看到的只是字段,而不是行为。
  • 这就是想法。如果我将公共字段放在这两个类之间。将来我可能不得不打破它。但是,如果我将来将它们转换为行为,我将不必打破层次结构。
  • 现在做有意义的事。除非您知道会发生什么,否则在未来进行校对是没有意义的。
  • 当前的基类不适合 MobileAd 类怎么办?或者,换一种说法,在当前的两个类和 MobileAd 之间共有哪些行为/属性?只有您知道答案,因为我们目前还没有足够的信息。

标签: c# design-patterns inheritance composition


【解决方案1】:

我没有看到重复的代码,我看到几个类的成员具有相同的名称和类型。

Is CheckoutAd a SiteAd? (yes inherit)
Does CheckOutAd have a SiteAd? (yes aggreate)
No to both, leave them the heck alone..

【讨论】:

    【解决方案2】:

    由于我无法推测未来的类,从我在这里看到的情况来看,这对于接口或抽象类来说都是一个完美的地方。

    Absract 类可以有方法和属性填充需要被覆盖。

    由于您只有空属性,因此界面看起来更合适。

    看看:C# interfaces - What's the point?

    【讨论】:

    • 那你的问题好像太含糊了。这似乎涉及猜测,或者可能是计划不足。
    • 哪一部分不清楚?你能澄清你不明白的吗?我已经提到了基类。你的回答重复了我已经知道的。
    • 在 Oded 的 cmets 的基础上,我将使用一个接口来构建类,因为它现在是有意义的。如果将来您无法将 MobileAd 放入界面中,那么它不应该继承。
    【解决方案3】:

    这在很大程度上取决于您的应用程序、您的目标和您的时间框架。

    您需要实施任何您认为会降低复杂性的解决方案。如果您的对象要共享行为和数据,并且从基类继承它们将使您的应用程序更易于理解、更易读且不易混淆,那么请务必确定所有的用例广告,构建基类并继承。

    您不想做的是根据一些您尚未想到的“可能”场景选择设计。你最终会得到一些对当前状态没有意义的东西,并且不必要地包含一个甚至可能不会发生的东西的结构。

    找出您现在能想到的所有可能的广告类型。确定他们是否共享行为、数据、不共享或两者兼而有之。如果它们共享行为,则从定义该行为的基类继承。如果它们共享行为和数据,则从定义行为和数据的基类继承。如果他们共享数据,请将该数据包含在类的实例中。

    请记住,您的目标是降低复杂性。现在使用最简单的解决方案,并在遇到问题时对其进行迭代。不要为您推测可能发生的问题进行设计。

    【讨论】:

      【解决方案4】:

      除非方法重复,否则我不会考虑任何继承。你们有共同的领域,那又如何?我无法通过... 准确推断出您的意思,但可以说这是毫无意义的。因此,基类本身根本不使用泛化字段。

      在我的团队中,我们在将重复字段移动到基类时发生了一些冲突。在基类中保留公共字段可能违反SRP。说到未来:您可能决定为某个字段提供功能性 getter/setter 以赋予它一些副作用。你不能完全控制访问,因为它是通过基类接口可见的。

      两个类中具有相同名称的字段应具有与之相关的不同行为。如果行为相同,则创建基类并在那里提取重复的方​​法。

      所以,我的一般建议是:除非您概括链接行为,否则不要概括数据成员

      附:托尼霍普金森说得很对

      【讨论】:

      • 就我而言,另一种形式的重用滥用了这种事情。定义通用类/接口将花费您比三个整数更多的每种资源,除非您正在谈论大量实例,为什么您会有这么多子类别?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多