青语言开发文档

库的封装

创建于 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 人点赞过