c# - API 扩展中的对象链接与方法

标签 c# oop lego-mindstorms

所以我正在考虑根据自己的需要扩展/调整 API。我说的是 Lego Mindstorms C# API。我正在围绕它构建我自己的 API(基于适配器模式),以便我可以以更好的 OO 方式对机器人进行编程。

这是有关 API 工作原理的链接:Lego Mindstorms EV3 C# API

但现在我被 C# API 处理命令的一种非常奇怪的方式困住了。

Definitely not the OO-way...

示例:要向砖 block 发送命令,您需要有一个砖 block 实例来发送命令。但是 DirectCommand 实例与砖 block 无关。

await brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.A, 50, 5000);

所以我想做的是让 brick 和 DirectCommand 松耦合。

这是另一个例子: 执行一批命令。你必须写出所有的命令,然后执行某个方法。在当前的 API 中,无法循环遍历数组并将它们添加到堆栈元素,以便稍后执行它们。

brick.BatchCommand.TurnMotorAtSpeedForTime(OutputPort.A, 50, 1000, false);
brick.BatchCommand.TurnMotorAtPowerForTime(OutputPort.C, 50, 1000, false);
brick.BatchCommand.PlayTone(50, 1000, 500);
await brick.BatchCommand.SendCommandAsync();

所以我想做的是:

创建一个像 PlayTone(..) 这样的命令,将它添加到命令的数组列表中,然后循环遍历它...

List<Command> toBeExecuted = new List<Command>;
toBeExecuted.Add(DirectCommand.PlayTone(50, 1000, 500));
brick.DirectCommand(toBeExecuted[0]);

所以如果有人能提供帮助...我会很高兴 :)

最佳答案

不完全是它们的设计目的,但您可以将它们作为任务列表排队,然后传递给它吗?

像这样:

static void Main(string[] args)
{
    //---- queue commands into a "batch"
    List<Task> toBeExecuted  = new List<Task>();
    toBeExecuted.Add(Task.Run(() => dothing()));
    toBeExecuted.Add(Task.Run(() => dothing()));
    toBeExecuted.Add(Task.Run(() => dothing()));
    toBeExecuted.Add(Task.Run(() => dothing()));
    toBeExecuted.Add(Task.Run(() => dothing()));


    //---- elsewhere
    Task.WaitAll(toBeExecuted.ToArray()); //fire off the batch
    await brick.BatchCommand.SendCommandAsync(); //send to brick
}

将 dothing() 替换为您要排队的批处理命令:

.Add(Task.Run(() => brick.BatchCommand...()));

关于c# - API 扩展中的对象链接与方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934043/

相关文章:

c# - UWP 基于 Jenkins 构建

c# - MVC3中 'Model'的意义?

ios - 如何让两个自定义 UICollectionViewCell 类共享相同的变量名

用于乐高头脑 Storm 的 Javascript

c# - 在 C# 中将 IList 转换为数组

c# - RemoteAttribute 没有将查询字符串作为 IEnumerable<T> 正确传递

java - TynyVM 与 LegOS 配合使用时出现异常

java - 土耳其语语音识别

oop - 父类和父类(super class)的区别

vba - 在 VBA 中链接类