interface - Nim - 创建实现方法的对象序列

标签 interface typeclass nim-lang multimethod

我想编写一个游戏,并想为多个实体使用组件模式。

在具有接口(interface)/类型类/多重继承的语言中不会有问题。

我希望某些实体是可更新的但不可渲染的,而有些则两者兼而有之。

haskell :

class Updateable a where
    update :: Float -> a -> a

class Renderable a where
    render :: a -> Picture

class InputHandler a where
    handleInput :: Event -> a -> a

我可以创建一个可以更新的列表。
updateAll :: Updateable a => Float -> [a] -> [a]
updateAll delta objs = map (update delta) objs

在 Java/D/... 这可以通过接口(interface)实现
interface Updateable {
    void update(float delta);
}

// somewhere in a method
List<Updateable> objs = ...;
for (Updateable o : objs) {
    o.update(delta);
}

现在我想知道如何使用多种方法在 nim 中实现这一点。

拟合多方法的存在可以用类型表示吗?
var objs: seq[???] = @[]

编辑:添加了更多代码并修复了不正确的 Haskell 示例

最佳答案

我不确定这是否能回答你的问题,但值得一提。

如果您要根据类型将游戏对象存储在单独的列表中,您仍然可以编写很多通用逻辑。由于预读和分支预测,按类型存储对象具有更好的性能。看这个讲座,来自一个应该知道他在说什么的人:Multiprocessor Game Loops: Lessons from Uncharted 2: Among Thieves .

例如,如果您定义了 texture proc 为你的一些对象类型,然后你可以写一个通用的 draw(t: T) = magicRenderToScreen(texture(t)) proc 这将适用于所有人。如果您正在实现资源池或任何类型的一般行为,这也很有用。

您确实必须以某种方式在渲染和更新循环中包含每个受影响的对象类型,但这在实践中通常不是什么大问题。您甚至可以使用一个简单的宏来减少冗长,因此您的渲染循环只包含类似 renderAll(players, enemies, sprites, tiles) 的内容。

通用列表在编译语言中并不简单,并且 nim 会强制您查看它,这在您开发游戏时非常有用。要拥有通用列表,您通常要么必须使用指针和动态调度,要么使用某种联合类型。我似乎记得 nim 曾经能够从父对象 ref 分派(dispatch)到正确的多方法(这将使列表能够包含多种类型并在运行时动态分派(dispatch))但老实说我不确定这是否仍然可以完毕...?

有更懂的人请告诉我们!

关于interface - Nim - 创建实现方法的对象序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116592/

相关文章:

oop - 为什么接口(interface)或抽象类有用? (或者为了什么?)

haskell - 从约束对产品成立的事实证明约束对产品的某个组成部分成立

nim-lang - 如何在 Nim 中将变量增加 1

Delphi:击键或 IDE 选项来填充类上的界面元素

java - 如果常量接口(interface)反模式是一种犯罪行为,那么 Swing 为什么要这样做呢?

java - 如何将实现特定接口(interface)的任何类作为参数传递并使用其方法?

haskell - "Subclassing"在 Haskell 中显示?

haskell - 泛型 - 创建组合所有字段的记录产品

javascript - 在带有 Emscripten 的 Nim 中使用字符串会导致 JavaScript 错误

c# - 使用 Nim 生成用于 C#/VB6 的 DLL