English 中文(简体)
1. 打破多变状态与未继承成员分离
原标题:Breaking polymorphism vs. subclasses with unused inherited members
  • 时间:2009-10-31 04:02:18
  •  标签:

如果我使用继承财产,并且后来认识到,单一子类需要一种无法利用的方法或领域,我是否宣布,在基类,而不是在其他子类中执行,或者我是否在该次子级宣布这样做?

如果我选择宣布分流中的方法,那么我再也无法以多变方式处理所有问题。 另一方面,如果我选择将其归入基类,那么我最后会发现许多子类,不执行财产或方法。 我在网上框架中看到了选择不执行办法的例子。 前进的最佳途径是什么?

最佳回答

如果只有一个子级有X方法,当然,你可以按定义使用X多种形态。 X在超级阶级(因此在任何地方)中存在是否合理,但在大多数情况下是一无选择? 有时,你不得不重新思考整个阶层的等级,即:为什么do<>/strong>。 你们想要说的是多吗? 哪里可能不存在(或最好不可行)? 如果不了解很多情况,就不可能做出反应。 更确切地说,你的具体使用案例!

问题回答

A方法不属于基类,除非所有可能的衍生产品都得到适当的执行。

If you have to throw NotSupportedException in some of your derivations, then you have broken the Liskov Substitution Principle. This principal basically states than any derived class should be appropriate whenever a base class is expected.

公众与某个阶层的联系应尽可能协调一致。 如果我面临这种选择,我几乎总是把它归入衍生类别,除非我really认为这一行动属于基地。

<>Update>

我要重复我先前的发言。 正如Wayne Hartman所指出的,如果情况确实如此,那么。 系统.IO.Stream也将打破低功能系统。 该规则规定,你不能对次类方法提出新的例外。 这似乎不适用于抽象方法,因为它们没有执行。

我认为,重要的是保持你的抽象性。 如果从你的抽象观点来看,在基数类别中增加这种方法是有意义的,那么就以一切手段这样做。 然而,如果你只是想增加守则,那么我会避免在基础中增加。

我还同意,有时为了一致性而部分执行是适当的。

它只是一种子类需要的专门方法吗? 然后在子类执行。 否则,作为基本阶层的虚拟执行,放弃了“不执行”的接受。 之后,在任何需要的情况下,它作为压倒性添加。

如果只能在子类使用,不需要多变,则只在子类执行。 然而,如果你需要多变地利用这一功能,那么就想到这一功能对超级类别的其他子类意味着什么。

如果这一职能没有很好的意义,那么你可能需要重新考虑你的等级。 然而,如果职能没有有效意义,你就只能对子类实行禁忌或放弃。 我实际上不是一股狂热的,但有时却在使用上 t。

我总是宁愿使用<代码> NotImplemented风格的例外情况处理尚未完成的代码。 我永远不会亲自使用它,因此,我可以把更多的方法推向一个基类。

就此,您需要回答关于您的意向的一些问题。

  1. How is your API to be used: If your API consumers are to almost always refer to your base class, then it may make sense to put it into the base class.
  2. If the method your trying to implement is applicable to almost all derived classes that could choose to implement the functionality, then put it in the base class.

考虑<代码>System.IO.Stream,这是一个抽象的类别,有抽象的寻求业务方法,因此不必从<代码>System.IO.SeekableStrem上提取。 仅仅为了寻求功能,APIC的用户只应当提到Stream





相关问题