jmjoy
个人博客
多继承完美闪避成员名冲突的问题
class A {
    fn t() {
        "A::t"
    }
}

class B {
    fn t() {
        "B::t"
    }
}

class C {
    extends A {
        fn t() {
            "(C override A)::t"
        }
    }
    extends B {
    }

    fn t() {
        "C::t"
    }
}

class D {
    extends B {
    }
    extends C {
        fn t() {
            parent.t()
            (parent as A).t()
            (parent as B).t()
            "(D override C)::t"
        }
    }
    fn t() {
        "D::t"
    }
}

C c = new c()
c.t() // C::t
(c as A).t() // (C override A)::t
(c as B).t() // B::t

D d = new D()
d.t() // D::t
(d as A).t() // (C override A)::t
(d as B).t() // B::t
(d as C).t() // C::t
             // (C override A)::t
             // B::t
             // (D override C)::t

这里的as其实是类型声明或强制类型转换。

对于类继承的所有父类,都有一个独立的域。

对象通过对不同的声明类型使用不同的方法,到达多态的效果,即使类中有多个重名方法也不受影响。

但是要为了解决菱形继承的问题:

class A {
    fn t() {
        "A::t"
    }
}

class B {
    fn t() {
        "B::t"
    }
}

class C {
    extends A {
        fn t() {
            "(C override A)::t"
        }
    }
    extends B {
        fn t() {
            "(C override B)::t"
        }
    }
}

class D {
    extends A {}
    extends B {}
}

fn c_a_t(c: C(A)) {
    c.t()
}

fn c_b_t(c: C(B)) {
    c.t()
}

// fn c_t(c: C) {
//     c.t() // 编译错误!不知道使用哪一个t()
// }

D d = new D()
(d as A).t() // A::t
(d as B).t() // B::t
// d.t() // 编译错误!不知道使用哪一个t()
// (d as C).t() // 编译错误!不知道使用哪一个t()
                // 但是如果确实要将d多态为D,就要明确要使用的类
(d as C(A)).t() // (C override A)::t
c_a_t.t() // (C override A)::t
(d as C(B)).t() // (C override B)::t
c_b_t.t() // (C override B)::t

Last modified on 2016-06-10