【发布时间】:2016-03-20 16:50:01
【问题描述】:
我想编写一个游戏,并且想为多个实体使用组件模式。
在具有接口/类型类/多重继承的语言中不会有问题。
我希望某些实体可更新但不可渲染,而某些实体应两者兼而有之。
哈斯克尔:
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 Updateable {
void update(float delta);
}
// somewhere in a method
List<Updateable> objs = ...;
for (Updateable o : objs) {
o.update(delta);
}
现在我想知道如何在 nim 中使用多种方法来实现。
拟合多方法的存在可以用类型来表示吗?
var objs: seq[???] = @[]
编辑:添加了更多代码并修复了不正确的 Haskell 示例
【问题讨论】:
-
似乎 concepts 是要走的路,但它们仍然是 WIP,我无法创建
seq[Updatable]。type Updateable = concept x update(x) -
尚不清楚您希望如何在示例中使用多重继承。例如,如果组件没有“实现”render() 或 update(),为什么不干脆什么都不做呢?查看流行引擎的基于组件的架构(Unity3d、UE4),它们不使用用户实现的核心类的接口 - 考虑单个“组件”类型比考虑可能需要实现的许多接口更容易。跨度>
标签: interface typeclass nim-lang multimethod