2009-06-21 41 views
0

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

  • 基本节点项目
    • 需要能够存储一个矩阵
    • 还需要能够存储子节点列表
    • 以及单父节点
  • 转换节点项目
    • 需要具有Draw方法(实施是非常可能的是相同的)
    • 要求基本节点项是 实现/从
  • 绘制对象节点项衍生
    • 需要具有
    • 一个Draw方法(实施方式可以是不同的)要求的基节点项是 实现/源自并不能 来实现/派生从旁边 第t ransform节点项目

我应该使用什么方案的基础类/接口的呢?

+1

这里有一个相关的SO问题:接口与基类http://stackoverflow.com/questions/56867/interface-vs-base-class – 2009-06-22 00:18:13

回答

2

Jasonh介绍了基本知识 - 在想要共享代码的地方使用抽象类,否则使用接口。

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

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

+0

所以,如果我理解正确的话,我最好的选择是建立一些抽象类,实现一个接口,以便我仍然可以从其他类派生,如果需要的话? – RCIX 2009-06-22 00:21:39

1

如果在放入抽象类中的所有类之间存在通用代码,并且它们都需要与此代码相同的一组方法,那么区别对待就是如此。如果是这种情况,请和抽象类一起去。如果没有共同的代码,或者你最终会做出不常见的代码,那么就去一个界面吧。

2

接口和抽象类用于两个不同的事情 - 接口用于定义合同,而抽象类用于提供基础实现和共享通用代码。所以你应该明确地总是使用接口,有时(我认为你的情况是这种情况)也抽象类,以避免重复代码。

因此,只有你会得到以下接口。

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

我假设你可以将公共节点特定的代码放到基类中。

abstarct class Node : INode { } 

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