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实际上是类型声明或强制类型转换。ide
对于类继承的全部父类,都有一个独立的域。code
对象经过对不一样的声明类型使用不一样的方法,到达多态的效果,即便类中有多个重名方法也不受影响。对象
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
:smirk:继承