C# 构建新的层次结构,使用抽象类还是接口?

C# 构建新的层次结构,使用抽象类还是接口?,c#,oop,scenegraph,C#,Oop,Scenegraph,我正准备为我的游戏构建一个2D场景图,我想知道我应该在它的根节点使用一个接口还是两个或两个抽象类。以下是我的要求: 基本节点项 需要能够存储矩阵 还需要能够存储一个列表 子节点数 以及单个父节点 转换节点项 需要绘制方法(实现很可能相同) 要求基本节点项为 实施/衍生自 可绘制节点项目 需要绘制方法(实现可能不同) 要求基本节点项为 实现/派生自,但不能 实施/衍生于 转换节点项 对于这一点,我应该使用什么样的基类/接口方案?区别在于,如果可以放入抽象类中的所有类之间都有公共代码

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

  • 基本节点项
    • 需要能够存储矩阵
    • 还需要能够存储一个列表 子节点数
    • 以及单个父节点
  • 转换节点项
    • 需要绘制方法(实现很可能相同)
    • 要求基本节点项为 实施/衍生自
  • 可绘制节点项目
    • 需要绘制方法(实现可能不同)
    • 要求基本节点项为 实现/派生自,但不能 实施/衍生于 转换节点项

对于这一点,我应该使用什么样的基类/接口方案?

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

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

Jasonh介绍了基础知识——在要共享代码的地方使用抽象类,否则就使用接口

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


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

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

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


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

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

因此,仅使用接口,您将获得以下信息

class Transformation : INode, ITransformation { }
class GraphicsObject : INode, IGraphicsObject { }
我假设您可以将特定于公共节点的代码分解成一个基类

abstarct class Node : INode { }

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

接口和抽象类用于两种不同的用途—接口用于定义契约,而抽象类用于提供基本实现和共享公共代码。因此,您应该始终明确地使用接口,有时(我认为您的情况就是这样)还应该使用抽象类,以避免重复代码

因此,仅使用接口,您将获得以下信息

class Transformation : INode, ITransformation { }
class GraphicsObject : INode, IGraphicsObject { }
我假设您可以将特定于公共节点的代码分解成一个基类

abstarct class Node : INode { }

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

这是一个相关的SO问题:接口与基类这是一个相关的SO问题:接口与基类所以如果我理解正确,我最好的办法是构建一些实现接口的抽象类,这样如果需要,我仍然可以从其他类派生?如果我理解正确,我的最佳选择是构建一些实现接口的抽象类,以便在需要时仍然可以从其他类派生?