0

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

  • 基础节点项
    • 需要能够存储矩阵
    • 还需要能够存储子节点列表
    • 以及单个父节点
  • 变换节点项
    • 需要有一个 Draw 方法(实现很可能是一样的)
    • 要求基节点项是从实现/派生的
  • 可绘制节点项
    • 需要有一个Draw方法(实现可能不同)
    • 要求基节点项从变换节点项旁边实现/派生,并且不能从变换节点项旁边实现/派生

我应该为此使用什么基类/接口方案?

4

3 回答 3

2

Jasonh 涵盖了基础知识——在您想要共享代码的地方使用抽象类,否则使用接口。

我想补充一点——即使你走抽象类路线,我仍然建议你也创建一个接口。你永远不知道什么时候你会想要一个像其他子类一样的子类,但出于某种原因确实需要继承另一个类。抽象基类非常适合保存实现代码。接口虽然更灵活,所以除非有充分的理由(即您的测试表明您无法承受虚拟方法调用的性能损失),否则请在有意义的地方使用接口和抽象基类。

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

于 2009-06-22T00:14:47.473 回答
2

接口和抽象类用于两种不同的事情——接口用于定义合约,而抽象类用于提供基础实现并共享通用代码。因此,您绝对应该始终使用接口,有时(我认为您的情况就是这样)也使用抽象类以避免重复代码。

所以只有接口你会得到以下。

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

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

abstarct class Node : INode { }

class Transformation : Node, ITransformation { }
class GraphicsObject : Node, IGraphicsObject { }
于 2009-06-22T00:22:58.033 回答
1

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

于 2009-06-22T00:01:38.263 回答