我有一个类层次结构:
class ParentClass:
def do_something(self):
pass # child classes have their own implementation of this
class ChildClass1(ParentClass):
def do_something(self):
<implementation here>
class ChildClass2(ParentClass):
def do_something(self, argument_x):
<implementation here>
class ChildClass3(ParentClass):
def do_something(self, argument_y):
<implementation here>
这里有两个问题:
- 在子类中,方法do_something()的接口不同:它在子类2和3中接受一个参数,但在子类1中没有参数
- do_something()的参数在子类2和3中具有不同的名称,以强调它们在不同的子类中具有不同的含义。下面的用法示例将更加清晰明了。
有一个工厂类返回实例:
class ChildFactory:
def get_child(self, argument):
if argument == '1':
return ChildClass1()
elif argument == '2':
return ChildClass2()
elif argument == '3':
return ChildClass3()
在代码的后面:
...
# pseudocode, not python
child_type = ? # can have values '1', '2' or '3' at this moment
var1 = 1
var2 = 'xxx'
# var1 and var2 have different types, just to emphasize the difference in their
# meaning when being passed as arguments to do_something()
# this was mentioned above (the second problem)
child = ChildFactory.get_child(child_type)
if child is an instance of ChildClass1, child.do_something() is called
if child is an instance of ChildClass2, child.do_something(var1) is called
if child is an instance of ChildClass3, child.do_something(var2) is called
# end of pseudocode
问题:
- 上述两个问题是糟糕设计的标志吗?如果是,正确的层次结构设计方法是什么?
- 如何在Python中统一编写伪代码片段?主要问题是避免为每个特定情况使用巨大的if/else语句,因为它将使ChildFactory.get_child()的if/else语句加倍。
Joker
的卡牌比较仍然接受一个参数,只是不使用该参数。def beats(self, aCord): return True
。尽管忽略了参数,但卡牌比较是该方法的含义。 - S.Lottfrom_file
的静态工厂方法,而基类中的工厂方法需要一个子类方法没有的额外参数,那该怎么办呢? 实际上,对于静态方法来说,这是否重要? - Ray