组合与继承 组合优于继承

为什么师傅大佬说组合优于继承呢,在python里也是,下班前几分钟正好浅浅学习一下

由于是小白的学习过程记录,有不完善的地方后面会慢慢改进哈,欢迎大家指点

众多设计模式强调的两个最核心原则

1.Program to an interface, not an implementation.
(面向接口编程,而不是具体的实现)
2.Favor object composition over class inheritance.
(若某个场景的代码复用既可以通过类继承实现,也可以通过对象组合实现,尽量选择对象组合的方式)

组合与继承三个大体的指导原则:

(1) 不惜一切代价的避免使用多重继承,因为它太复杂以至于不可靠。如果非要用,那得准备好钻研类层次结构,以及花费时间去找各种东西的来龙去脉。
(2) 如果有一些代码会在不同位置和场合应用到,那就用组合来把它们做成模块。
(3) 只有在代码的可复用部分之间有清楚的关联,可以通过一个单独的共性联系起来的时候,才使用继承,或者现有代码或者别的不可抗拒因素所限非要继承不可的时候去使用继承。(比如使用简单工厂+模板模式)

继承与组合对比

● 执行时是否能改变其行为
类之间的继承关系在编译时静态地定义好的,继承了基类的子类,容易修改父类的行为,但因编译阶段已经定义好,在执行时就不能改变子类的行为
而组合(类似模块和接口)在运行的时候能够动态指定(传入的对象是变化的,比如上一步运行得到的),那么这个对象可变,组合里的不同的类都可传不同对象的进去

● 代码耦合性:
子类必定包含父类的所有方法,可选择的使用,或者重写
而组合是需要什么,就放什么进来,所以它的耦合性比继承低得多

● 类继承缺点:
通过继承实现的代码复用,本质上把父类的内部实现细节暴露给了子类,子类的实现会和父类的实现紧密的绑定在一起,结果是父类实现的改动,会导致子类也必须得改变。

● 组合的优点:
对象的组合是在运行时通过对象之间获取引用关系决定的,所以对象组合要求不同的对象遵从对方所实现的接口来实现引用传递,这样反过来会要求更加用心设计的接口,以此支持你在使用一个对象时,可以把它和很多其他的对象组合在一起使用而不会出现问题。
对象的组合由于是通过接口实现的,这样在复用的过程中不会打破其封装。任意一个对象都可以在运行时刻被替换成另外一个实现了相同接口且类型相同的对象,更重要的是,由于一个对象的实现是针对接口而编写的,具体实现之间的依赖会更少。
对象组合的方式可以帮助你保持每个类的内聚性,让每个类专注实现一个任务。类的层次会保持的很小,不会增长到一种无法管理的恐怖数量。

上代码(python):

继承+super()

class Human(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender


class Robot(Human):
    def __init__(self, name, gender, language, body):
        super(Human, self).__init__(name, gender)
        self.language = language
        self.body = body
        self.technology = 'AI'


rob = Robot('Jason', 'gender neutral', 'Python and C++', 'information stream')

print(rob.name)
print(rob.gender)
print(rob.language)
print(rob.body)
print(rob.technology)

组合

class Human(object):
    def work(self):
        print("Human working")

    def learn(self):
        print("Human learning")


class Robot(object):
    def __init__(self):
        self.technology = 'AI'
        self.human = Human()

    def work(self):
        self.human.work()
        print("Robot working too")

    def learn(self):
        self.human.learn()
        print("Robot learning too")


rob = Robot()
rob.work()
rob.learn()

你可能感兴趣的:(设计模式,python,组合与继承)