d的静态类
原文
在Java/C#
中,可创建纯静
类.
这些类
的方法都是静
的,不能继承或实例化
类:
static class Algo {
void drawLine(Canvas c, Pos from, Pos to) { ...... };
}
使用类:
Algo.drawLine(new Canvas(), new Pos(5, 3), new Pos(7, 9));
在D中是不可能
的,这很差.解决办法似乎是:
final abstract class Algo {
void drawLine(Canvas c, Pos from, Pos to) { ...... };
}
在D中无法实现该功能
.final
表示不能扩展类,abstract
不能实例化自己
.然而,与Java
和C#
不同,不实例化
所述类
就不能调用
函数,因为函数
在类对象上工作.
此外,还有静
关键字,但可按外部类
成员实例化静类
.
D不是Java
,也永远不会是,如果想要类似
功能,可把函数
放进单独
文件中,然后在文件
顶部加一行:
module modulename;
并命叫modulename.d
.然后,可按java
中的.class
文件用此模块
,方法是添加
import modulename;
到使用
它的文件.
此外,还有各种导入选项
,如重命名或静导入
(不给模块
加域,因此不需要全名
)
静导入
,可用来模拟
名字空间,更复杂
的是创建包含公开导入
的模块来组合
内容,但这在D中并不常见
.静导入
static import std.stdio;
void main()
{
//否,不会解析此函数,编译错误
// wrtiteln("hello");
// 好
std.stdio.writeln("hello");
}
有两个方法,一个是私实现:
module drawer.impl;
void drawLine(...)
然后,创建另一个文件:
module drawer;
public import Algo = drawer.impl;
之后,可按Algo.drawLine
使用.
使用单文件,可如下:
final class Algo
{
@disable this();
static:
void drawLine(...){}
}
上面也是可行
的,但与Java
不同,在Java
中,每个类
都有自己
的文件.
静方法
就是这样.
如果要禁止创建类
,用@disable this();
,如果要使所有方法
都是静
的,请把静:(static:)
放在类顶上.
注意,此时类
变成了名字空间
,也可用模板
,尽管它可能有点难看:
template Algo_ns()
{
void drawLine(Canvas c, Pos from, Pos to) {...}
}
// 需要这样才能避免`实例化语法`
alias Algo = Algo_ns!();
但,浪费了类的其他功能(生成typeinfo
,添加到类型系统
等),因此模板
不会这样做.
但是为什么不把drawLine
搞成自由
函数呢?
import bluepandastuff.algo;
auto canvas = new Canvas();
drawLine(canvas, Pos(5, 3), Pos(7, 9));
// 或用UFCS:
canvas.drawLine(Pos(5, 3), Pos(7, 9));
我把Pos
转换成了典型
值类型的结构
.
没错.
void Algo_drawLine(Canvas c, Pos from, Pos to) { ...... };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现