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
构成重载集
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现