最好的答案将取决于这些类的用例和环境。作为开发应用程序或框架的团队的一部分,采用该团队使用的设计模式比寻求“完美”解决方案更可取,因为它可以使其他人更容易采用和维护您的代码。
您如何期待这些类的使用和扩展也很重要。你会期待'Square'在将来需要移动吗?Shape的可移动性总是静态的,或者它可能作为动态属性更有用? Move()对于不是Shapes的类有任何值吗?如果可移动性的动态属性是有用的,可以这样考虑:
public abstract class Shape
{
public bool isMovable()
{
return false;
}
public virtual void Move()
{
if (!isMovable() {
throw new NotSupportedException();
} else {
throw new BadSubclassException();
}
}
}
你的子类可以然后覆盖isMovable提供静态或动态行为,可以进一步修改或子类随着时间的推移,只要你的文档使清楚的是,移动应始终在移动的调用之前。默认行为应基于您期望使用您的代码的其他人的期望,这取决于他们如何实施相关设计模式。
作出这些决定的挑战的一个很好的例子,可以通过查看如何集合类的易变性在不同的框架已经进化历史中找到。已经有设计将可变类(集合,数组,字典等)作为基类,在子类中实现了不变性,以及相反。有两种方法,以及一个动态的方法有效参数,但对于一个框架,用户最重要的因素是一致性,因为什么是正确的是真的,什么是最简单的事来使用,提供安全性能不会受到影响。
这个。 “如何不继承一些基本行为”这个问题的答案始终是“不要从一开始就继承它”。 – KeithS
@KeithS,这是正确的。停止继承只是看待继承的反面。所以,希望这会帮助OP认为前进的另一种方式。 :) –
@Mike,'IMovable'怎么样? – smartcaveman