构建新的层次结构,使用抽象类或接口?

时间:2009-06-21 23:57:15

标签: c# oop scenegraph

我正准备为我的游戏构建一个2D场景图,我想知道我是否应该使用它的根或一个接口或两个或几个抽象类。这是我的要求:

  • 基本节点项目
    • 需要能够存储矩阵
    • 还需要能够存储列表 子节点
    • 以及单个父节点
  • 转换节点项
    • 需要有一个Draw方法(实现很可能是相同的)
    • 要求基节点项为 实施/衍生自
  • 可绘制节点项
    • 需要有一个Draw方法(实现可能会有所不同)
    • 要求基节点项为 实施/衍生自和不能 与...一起实施/衍生 转换节点项

我应该使用哪种基类/接口方案?

3 个答案:

答案 0 :(得分:2)

Jasonh介绍了基础知识 - 使用您想要共享代码的抽象类,否则使用该接口。

我想补充一点 - 即使你去了抽象类路线,我仍然建议创建一个接口。你永远不知道什么时候你想要一个像其他子一样的子类,但是出于某种原因确实需要继承另一个类。抽象基类非常适合保存实现代码。接口更灵活,所以除非有一个非常好的理由(即你的测试显示你不能承受虚拟方法调用的性能),所以使用一个接口以及一个有意义的抽象基类。

我的一般规则是:使用接口来定义API,并使用抽象基类来允许接口的实现共享代码。

答案 1 :(得分:2)

接口和抽象类用于两个不同的东西 - 接口用于定义合同,而抽象类用于提供基本实现和共享公共代码。因此,您应该始终使用接口,有时(我认为您的情况就是这种情况)也是抽象类,以避免重复代码。

因此,只有界面才能获得以下内容。

class Transformation : INode, ITransformation { }
class GraphicsObject : INode, IGraphicsObject { }

我假设您可以将公共节点特定代码分解为基类。

abstarct class Node : INode { }

class Transformation : Node, ITransformation { }
class GraphicsObject : Node, IGraphicsObject { }

答案 2 :(得分:1)

如果在可以放入抽象类的所有类之间存在公共代码,并且它们都需要与此代码相同的方法集,那么区别就在于此。如果是这种情况,请使用抽象类。如果没有通用代码,或者最终会使代码变得不常见,那么请使用接口。