Fin*_*las 2 c# language-agnostic inheritance interface
我刚刚第一次使用它 - 考虑:
IGameObject
void Update()
IDrawableGameObject : IGameObject
void Draw()
Run Code Online (Sandbox Code Playgroud)
我有一个使用DrawableGameObjects的级别类 - 我把它改为IDrawableGameObject,而不是减少耦合和辅助TDD.
但是我当然失去了在没有强制转换的情况下调用Update(..)的能力 - 为了解决这个问题,我使用了继承.我之前从未使用过基于接口的继承 - 除非在这种情况下,我也没有真正找到需要.
我真的不想每次都在我的更新方法中,因为它每秒调用60次,另一方面foreach(..)可以使用IGameObject的.
有什么建议?
编辑
我应该添加 - 我之后创建的假单元用于单元测试,然后实现IDrawableGameObject - 这些类现在有很多方法,而不是每个接口只有少数几个.我知道接口必须只是少数几个成员,但继承是否违反了这一规则?
谢谢
我知道接口必须只是少数几个成员
他们需要包含尽可能多的成员来表达这个概念 - 不多也不少.BCL中有一些非常可怕的界面(尽管你可能会说有些界面过大).
我说这绝对看起来像接口继承的可接受使用.
顺便说一句......如果存在仅依赖于接口成员的实现逻辑,请考虑使用扩展方法,以便实现类不需要重复它...例如:
// just a silly example that only uses members of the target type
public static void DrawComplete(this IDrawableGameObject obj, Canvas canvas) {
obj.Draw(canvas);
foreach(var child in obj.Children.OfType<IDrawableGameObject>()) {
child.DrawComplete(canvas);
}
}
Run Code Online (Sandbox Code Playgroud)
然后所有调用者都获得该DrawComplete方法,而不需要重复实现所有实现.