假设下面的类层次结构包含一个基类和一些继承自该基类的常规case类:
class BaseClass:
def f(self, a, b):
#do something
pass
class GeneralCase(BaseClass):
def f(self, a, b):
BaseClass.f(self, a, b)
#do something else
现在,假设我们有一个特殊情况,其中函数f
的一个参数是预先确定的常量。一
实现方法是从参数列表中删除此参数,如下所示:
干净的,专业的
缺点:当使用不同类的对象时,不同的方法签名可能会导致问题
选项2:设置默认值并断言它不更改
^{3}$专业人士:相同的签名
缺点:混淆接口:“为什么我们有参数b?如果我改变了怎么办?”在
你会选择什么方法?为什么?在
怎么样:
这样,特殊情况2根本不使用b,并且接口保持不变。在
它根本不应该是一个亚型(参照Liskov替代原理)。在
有一个
GeneralCase
的属性,即:此属性应适用于
GeneralCase
的所有子类型(也可以是duck类型的,无论类关系如何,都应该像GeneralCase
一样嘎嘎叫的任何子类型)。如果它不成立,所有处理这些对象的代码都必须知道它以及它周围的代码。这是一个不可接受的负担,而且基本上是不必要的。在如果这个属性对于某些特殊情况不是真的,那么这个特殊情况就不应该是子类型。它可能是高度相关的,但要么你需要一个更一般的}的特例。在
GeneralCase
,要么它不是{如果您希望代码重用,请使用mixin。如果我们不需要在{cdg}上定义更多的
相关问题 更多 >
编程相关推荐