d继承链中忽略了模板插件
import core.stdc.stdio;
class A
{
void visit(int a){ printf("A - int\n");}
void visit(float b) { printf("A - float\n");}
}
mixin template Bmix(AST)
{
// 移动进B
override void visit(int a) {printf("B - int\n");}
override void visit(float b) {printf("B - float\n"); super.visit(b);}
}
class B : A!int
{
alias visit = A!int.visit;
mixin Bmix!int;
}
class C : B
{
alias visit = B.visit;
override void visit(float b)
{
printf("C - float\n");
super.visit(b);
}
}
void main()
{
C vis = new C();
float c = 7.0;
vis.visit(c);
}
//输出:
C - float
A - float
把两个访问方法,单独移进去,则为
C - float
B - float
A - float
import std.stdio;
class A
{
void f(){ writeln("A.f"); }
}
class B: A
{
alias f = A.f;
mixin X!();
}
mixin template X()
{
override void f(){ writeln("B.f"); super.f(); }
}
class C: B
{
override void f(){ writeln("C.f"); super.f(); }
}
void main()
{
(new C).f();
}
同样,
C.f
A.f
//期望的是
C.f
B.f
A.f
ParseTimeTransitiveVisitor用插件访问,影响dmd作为库.
别名使事情复杂了.模板插件按名工作,f已在那,说明覆盖了模板插件版的f.B.f不是虚树的一部分,所以父没有错.你可以别名两个:
class B: A
{
alias f = A.f;
alias f = x.f;
mixin X!() x;
}
两个f构成重载集.
浙公网安备 33010602011771号