d模块实现多态
原文
我想到了两种可能性.一个是使用UFCS
,定义类型
作为第一个参数
的其他模块
中命名
函数(它不适合操作符重载),然后可用点语法
调用:
module myvector;
struct vector {
float x;
float y;
}
//
module myvectormath;
import myvector;
vector add(vector lhs, vector rhs) {
// 内部是普通函数.
vector result;
result.x = lhs.x + rhs.x;
result.y = lhs.y + rhs.y;
return result;
}
用法:
import myvector;
import myvectormath;
// 可用.号来调用
vector a = vector(0,0).add(vector(5, 5));
另一种可能的方法是把数据
放入结构或插件模板
中,然后通过放其入具有所需
功能的另一个结构
中来计算数学
:
// 数据
module myvector;
// 外部命名类型,
struct VectorData {
float x;
float y;
}
// 准备
mixin template vector_payload() {
// 构造器,方便初化
this(float x, float y) {
_data.x = x;
_data.y = y;
}
this(VectorData d) {
_data = d;
}
// 存储数据
VectorData _data;
alias _data this;//隐式转换.
}
// 数学#1模块
module myvectormath;
import myvector;
struct vector {
// 插件数据
mixin vector_payload!();
// 加方法,重载操作符
vector opBinary(string op:"+")(vector rhs) {
vector result;
result.x = this.x + rhs.x;
result.y = this.y + rhs.y;
return result;
}
}
// #2模块
module myvectormath2;
import myvector;
struct vector {
// 插件
mixin vector_payload!();
// 加方法
vector opBinary(string op:"+")(vector rhs) {
vector result;
// 完全不一样
result.x = this.x - rhs.x;
result.y = this.y - rhs.y;
return result;
}
}
// 用法
import myvectormath;
// 或
//import myvectormath2;
void main() {
vector a = vector(0, 0) + vector(5, 5);
import std.stdio;
writeln(a);
}
如何同时使用?这就是内部结构_Data
,构造器和别名的用武
之地.
因此,首先,要消除名字
歧义.现在,只使用全名
.
// 用法
import myvectormath;
import myvectormath2;
void main() {
// 指定类型
myvectormath.vector a = myvectormath.vector(0, 0) + myvectormath.vector(5, 5);
import std.stdio;
writeln(a); // 正确
}
怎样才能轻松地在内部
移动它们?创建使用#2
版本的函数:
void somethingWithMath2(myvectormath2.vector vec) {
// ...
}
如果传递"a"
变量给它,它会抱怨,因为它是myvectormath.vector
,而这是myvectormath2
.
但是,可很容易地转换它们,这要归功于mixin
模板中的外部数据结构,ctor
和别名:
somethingWithMath2(myvectormath2.vector(a));
编译!幕后
工作是myvectormath2.vector
有两个构造器:(float,float)
和(VectorData)
.它们都不匹配
a类型,所以接着它会别名本
即VectorData
.所以它隐式
转换然后匹配VectorDatactor
.也可只传递数据
:
import myvector;
void somethingWithMath2(VectorData a_in) {
// 运算
auto a = myvectormath2.vector(a_in);
// 使用
}
//调用
somethingWithMath2(a);
传递数据
可能是最好的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现