我正准备为我的游戏构建一个 2D 场景图,我想知道我是否应该在其根部使用一个接口或两个或几个抽象类。这是我的要求:
- 基础节点项
- 需要能够存储矩阵
- 还需要能够存储子节点列表
- 以及单个父节点
- 变换节点项
- 需要有一个 Draw 方法(实现很可能是一样的)
- 要求基节点项是从实现/派生的
- 可绘制节点项
- 需要有一个Draw方法(实现可能不同)
- 要求基节点项从变换节点项旁边实现/派生,并且不能从变换节点项旁边实现/派生
我应该为此使用什么基类/接口方案?
我正准备为我的游戏构建一个 2D 场景图,我想知道我是否应该在其根部使用一个接口或两个或几个抽象类。这是我的要求:
我应该为此使用什么基类/接口方案?
Jasonh 涵盖了基础知识——在您想要共享代码的地方使用抽象类,否则使用接口。
我想补充一点——即使你走抽象类路线,我仍然建议你也创建一个接口。你永远不知道什么时候你会想要一个像其他子类一样的子类,但出于某种原因确实需要继承另一个类。抽象基类非常适合保存实现代码。接口虽然更灵活,所以除非有充分的理由(即您的测试表明您无法承受虚拟方法调用的性能损失),否则请在有意义的地方使用接口和抽象基类。
我对此的一般规则是:使用接口来定义 API,并使用抽象基类来允许接口的实现共享代码。
接口和抽象类用于两种不同的事情——接口用于定义合约,而抽象类用于提供基础实现并共享通用代码。因此,您绝对应该始终使用接口,有时(我认为您的情况就是这样)也使用抽象类以避免重复代码。
所以只有接口你会得到以下。
class Transformation : INode, ITransformation { }
class GraphicsObject : INode, IGraphicsObject { }
我假设您可以将公共节点特定代码分解为基类。
abstarct class Node : INode { }
class Transformation : Node, ITransformation { }
class GraphicsObject : Node, IGraphicsObject { }
区别在于,如果所有类之间都有可以放入抽象类的通用代码,并且它们都需要使用此代码的相同方法集,那么它们之间的区别就在于。如果是这种情况,请使用抽象类。如果没有通用代码,或者您最终会使不应该通用的代码变得通用,那么请使用接口。