繼承強大而簡單,但實務上常會帶來混亂與複雜。

Replace Superclass with Delegate
像是堆疊(Stack)曾被做為串列(List)的子類別,但實應把串列當成堆疊的欄位,將必要操作委託給它即可,因為許多串列的操作並不屬於堆疊範疇。
用委託可以明確表達它是個獨立、僅保留某功能的東西。
權衡之下,作者建議先用繼承,出問題時再用此重構改為委託。
# Before
class Logger:
def log(self, message):
print(f"Log: {message}")
class FileLogger(Logger):
def log_to_file(self, message):
print(f"Writing to file: {message}")
# After
class Logger:
def log(self, message):
print(f"Log: {message}")
class FileLogger:
def __init__(self):
self.logger = Logger()
def log_to_file(self, message):
self.logger.log(message)
print(f"Writing to file: {message}")