记录多继承中Diamond Problem的一种解法(MRO算法)

1. 原理介绍

本小节引用自:《JavaScript中的“多继承”》

假设现在有这样的多继承结构:

其中 merge 的规则如下:
1. 取出第一个序列的 head
2. 如果,该 head 不在其它序列的 tail中,则把这个 head 添加到结果中并从所有的序列中移除它
3. 否则,用下一个序列的 head 重复上一步
4. 直到所有序列中的所有元素都被移除(或者无法找到一个符合的head)

最后我们来计算下图3中各个类的线性顺序:
L(O) = O
L(X) = X + L(O) = XO
L(Y) = Y + L(O) = YO
L(A) = A + merge(L(X), L(Y), XY)
= A + merge(XO, YO, XY)
= AX + merge(O, YO, Y)
= AXY + merge(O, O)
= AXYO
L(B) = B + L(Y) = BYO
L(C) = C + merge(L(A), L(B), AB)
= C + merge(AXYO, BYO, AB)
= CA + merge(XYO, BYO, B)
= CAX + merge(YO, BYO, B)
= CAXB + merge(YO, YO)
= CAXBYO

上述多继承结构的 python 示例可参见 https://glot.io/snippets/ez5bqslav2 输出了 C 这个类的 MRO 即 C A X B Y O
当然C3算法也有 bad case,会导致上述的 merge 在中途失败,也就是无法求出 MRO 的 case。关于 MRO 的更多细节可参考 The Python 2.3 Method Resolution Order 总之不推荐设计出过于复杂的多继承结构 =_=

2. MRO的逻辑实现

  1. 把继承序列竖着写
    A
    X B
    Y Y A
    O O B

  2. 把继承序列拼接为一行
    A X B Y Y A O O B

  3. 从前往后,删除已经出现过的元素
    A X B Y O

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值