Category: Perl6 Keywords: C3 method resolution order
介绍 C3 方案之前,我们先看看 Perl 5 的多重继承方案。package A;这是一个经典的多重继承,用图表表示如下:
sub hello { 'A::hello' }package B;
use base 'A';package C;
use base 'A';
sub hello { 'C::hello' }package D;
use base ('B', 'C');
<A>(hello)在 Perl 5 中当你调用 D::hello 时会比较奇怪地发现它输出的是 A::hello.
/ \
<B> <C>(hello)
\ /
<D>
这是因为在 Perl 5 中继承的顺序是 D->B->A->C
而按照我们一般的思路顺序则应当是 D->B->C->A 输出的应当为 C::hello在 Perl6 中我们就采用了 C3 这种算法,这种算法首先是在 Dylan 语言中实现。而后被应用到 CLOS 还有 Python 2.3。
现在我们将它应用到了 Perl6 和 parrot. Perl6 的 Perl6-MetaModel 作者 Stevan Little 用 Perl5 写了个版本,就是 Class::C3
- 一些参考的资料如下:
- A Monotonic Superclass Linearization for Dylan
- Class::C3
- http://www.python.org/2.2.2/descrintro.html#mro
- The Python 2.3 Method Resolution Order
- http://use.perl.org/~autrijus/journal/25768
比如前面的多重继承可以这么写:D, B, A, C, A
在 Perl 5 中去掉后后面重复的,而 C3 算法是把前面的父类去掉。详细的 C3 算法介绍等我看完那篇 Paper 后,如果有不吐不快之言,再写 journal.