库的封装
创建于 2023-04-28 / 最近更新于 2023-04-28 /
1618
字体:
[默认]
[大]
[更大]
如果我们在一个库中实现的功能比较多时,可以再定义一个Obj来对整个库的功能进行封装。
例如在SoundLib.cs文件中,我们定义了一个SoundLib类,同样继承Obj
class PlaySound : Native {
public override string Name { get; set; } = "播放音乐";
public override string Desc { get; set; } = "参数1-字符串,可选参数2-逻辑,返回对象;打开参数1对应的音乐文件,默认立即播放,若传入参数2,并且为真,则不立即播放";
public override Expr Run(List<Expr> args, Ctx ctx, Obj? obj = null) {
if (args.Count == 0) {
return Expr.Err("播放音乐函数需要文件路径参数");
}
if (args[0].Tp != TP.Str) {
return Expr.Err("播放音乐的文件路径参数必须是字符串类型");
}
string file = args[0].Str();
if (!file.StartsWith("/") && !file.Contains(":")) {
file = Directory.GetCurrentDirectory() + "/" + file;
}
if (!File.Exists(file)) {
return Expr.Err("要打开的音乐文件不存在");
}
bool wt = false;
if(args.Count > 1) {
wt = args[1].ToBool();
}
SoundDriver soundDriver = new SoundDriver();
……
return new Expr(TP.Obj, soundDriver);
}
}
这里我们同样通过实现Native的方式来实现提供播放音乐功能,但这个方法返回的是之前定义的SoundDriver类的对象。
当然,我们这是进一步的封装,如果你要实现的功能比较简单,只需要讲对应的功能封装成一个Obj即可,青语言在加载动态库时会实例化这个Obj对象以获取其功能。
这里我们是为了之后进一步丰富这个库的功能所以做了这样的设计,但这并不是必须的。
0 人点赞过