封装对象方法
创建于 2023-04-28 / 最近更新于 2023-04-28 /
1775
字体:
[默认]
[大]
[更大]
动态链接库中对象的方法通过继承Native类的方式来实现,我们来看SoundDriver.cs里一个比较简单的示例:
class PauseSound : Native {
public override string Name { get; set; } = "暂停";
public override string Desc { get; set; } = "无参,返回逻辑;暂停当前播放的音乐";
public override Expr Run(List<Expr> args, Ctx ctx, Obj? obj = null) {
WaveOutEvent wave = (WaveOutEvent)obj!.Raw;
if (wave.PlaybackState == PlaybackState.Playing) {
wave.Pause();
}
return new Expr(TP.Bool, true);
}
}
实现Native时,我们强烈建议大家把方法名称Name和方法的说明Desc补全,这样能够方便使用者了解这个封装方法的使用方式。
我们主要通过实现Run方法来提供响应的功能,Run方法提供了3个参数
args 传入的参数,是Expr序列
ctx 方法调用时所处的语境
obj 引起调用的对象,会传入我们封装的Obj对象,所以这里的obj不会为null
这个例子里,我们已知对象obj的Raw中会存放原生的WaveOutEvent对象,那么就可以对它进行操作。
这里定义的Native实现类同样需要绑定到对象上:
Map["@暂停"] = new Expr(new PauseSound());
同样是在构造方法中,向Map中添加绑定,并且方法应该以@开头。由于Native类型的Expr比较常用到,所以我们另外定义了一个Expr的构造方法,当传入的值是Native类型,创建的Expr就是TP.Native类型的,所以这里不需要传入类型,当然如果指定类型也是可以的。
这样我们就完成了对象方法的封装。
0 人点赞过