若有兩類別都做相同事,將相似處拉到超類別是個好主意。
我們不用在設計初期就依據真實世界的架構來定義繼承關係,在程式演變的過程中逐漸實作也很不錯。

Extract Superclass

提取類別(委託)也是種做法,而提取超類別(繼承)比較簡單。
我們可以先執行後者,日後再用替換子類別為委託類別來解決繼承長期會衍生的混亂。

# Before
class Employee:
    def __init__(self, name):
        self.name = name

    def report_hours(self):
        print("Reporting hours")

class Manager:
    def __init__(self, name):
        self.name = name

    def create_report(self):
        print("Creating report")

# After
class StaffMember:
    def __init__(self, name):
        self.name = name

    def report_hours(self):
        print("Reporting hours")

class Employee(StaffMember):
    pass

class Manager(StaffMember):
    def create_report(self):
        print("Creating report")