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

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}")