我有两个类(我们称之为Working和ReturnStatement),我不能修改它们,但是我想用日志记录来扩展它们。诀窍在于Working方法返回一个ReturnStatement对象,因此新的MutantWorking对象也返回ReturnStatement,除非我可以将其强制转换为MutantReturnStatement对象。代码如下:
# these classes can't be changed
class ReturnStatement(object):
def act(self):
print "I'm a ReturnStatement."
class Working(object):
def do(self):
print "I am Working."
return ReturnStatement()
# these classes should wrap the original ones
class MutantReturnStatement(ReturnStatement):
def act(self):
print "I'm wrapping ReturnStatement."
return ReturnStatement().act()
class MutantWorking(Working):
def do(self):
print "I am wrapping Working."
# !!! this is not working, I'd need that casting working !!!
return (MutantReturnStatement) Working().do()
rs = MutantWorking().do() #I can use MutantWorking just like Working
print "--" # just to separate output
rs.act() #this must be MutantReturnState.act(), I need the overloaded method
预期结果:
我正在包装Working。
我正在工作。
--
我正在包装ReturnStatement。
我是一个ReturnStatement。
问题是否能够解决?我也很好奇这个问题是否可以在PHP中解决。除非我得到一个可行的解决方案,否则我不能接受答案,请编写可行的代码以便获得认可。
ReturnStatement().act()
" - 如果你想让另一个类的 act 方法在当前对象上工作,请使用returnStatement.act(self)
- 或者将其标记为 classmethod 或 staticmethod - 如果它不需要当前对象的实例。 - jsbueno