2008-10-23 68 views
4

我正在写第二人称只是因为它容易,对你而言。扩展一个像命名空间(C++)的现有类?

你正在使用游戏引擎,并且真的希望特定的引擎类有一个新的方法来做'bla'。但是你不想将你的'游戏'代码传播到'引擎'代码中。

所以你可以用你的一个新方法从它派生出一个新的类,并把这个代码放在你的'游戏'源代码目录中,但也许还有另一种选择?

所以这在C++语言中可能是完全非法的,但你起初想过,“也许我可以通过我自己的头添加一个新的方法到现有的类,包括'父'头和一些特殊的语法。是可能的,例如...“

假设你不能跨多个头声明一个类的方法(并且你非常确信你不能),那么其他的选择是什么支持“中间件/引擎/库”和“应用程序”之间的清晰分界,你想知道吗?

+1

写在第二人称听起来像一个编程语言课程的考试问题。有人应该做一个研究,看看第一人称,第二人称或第三人称问题是否能产生更好的答案... – Mnebuerquo 2008-10-23 03:27:26

+2

你被分配做这样的研究。你将如何继续? – Spike0xff 2012-09-26 16:48:12

回答

7

我唯一的问题就是,“你添加的功能需要成为一个成员函数,还是它可以是一个自由函数?”如果你想要做的事情可以使用类的现有接口来解决,那么唯一的区别就是语法,你应该使用一个自由函数(如果你认为这很“丑陋”,那么......吸引它并继续前进, C++不是为monkeypatching设计的)。

如果您试图弄清楚班级内部的一些问题,这可能意味着原始班级缺乏灵活性(它并没有为您提供足够的信息,无法满足公众的需求接口)。如果是这样的话,也许原来的课程可以“完成”,然后你又回到了一个免费的功能。

如果没有绝对的,将工作,你只是必须有一个成员函数(如原始的类提供你想在保护成员,而你没有自由修改原来的接口)...只有采用继承和成员函数实现。

如需深入讨论(并解构std::string'),请查看Guru of the Week "Monolith" class article

0

听起来像你想要Ruby mixins。不确定在C++中有什么关系。我认为你必须做继承。

编辑:你可能会把一个朋友的方法和混合使用它,但我认为你会开始打破你的封装不好。

+0

添加好友功能需要类定义本身,这违背了这个问题的目的,因为你只需要添加的功能本身就存在着的修改。 – 2008-10-23 03:38:55

+0

您可能能够在同一个命名空间中添加一个简单的非朋友非成员函数,而这样既能保护封装,并增强你的类。事实上,这是* C++中的方法。 – paercebal 2008-10-23 07:00:02

1

听起来像'行为'关系,这不适合继承(谨慎使用!)。

一个选项是一个组合工具类,它通过使用指向它的指针实例化“引擎”的某个实例。

+0

如果实用程序类包含在另一个类,增加了功能,并暴露了全新的界面,可能会奏效。假设你是在加入如果您需要访问类的内部来实现你的功能,那么无论是类的鼻祖做错了或者你并不需要访问类的内部... – 2008-10-23 03:34:38

0

你可以做类似于COM的事情,其中​​基类支持一个QueryInterface()方法,它可以让你请求一个具有该方法的接口。这在C++中实现相当简单,您本身不需要COM。

你也可以“假装”成为一种更加动态的语言,并有一系列回调作为“方法”,并且使用模板或宏调用它们并在其余部分之前将“this”推入堆栈参数。但它会是疯了:)

0

或分类Objective C

在C++中有扩展类架构(而不是单一类)的概念方法,但它不是一种随便的行为,需要提前计划。抱歉。

1
  • 继承(正如你所指出),或
  • 使用功能,而不是一个方法,或
  • 改变发动机代码本身,而是分离和使用补丁管理器一样的被子管理的变化或Mercurial/MQ

虽然我没有看到这方面的继承有什么问题。

0

听起来像是一个典型的继承问题。除非我将代码放在“引擎增强”目录中&在您的体系结构中包含该概念。

1

如果新方法将使用现有的公共接口来实现,那么可以说它更加面向对象,因为它是一个单独的函数而不是方法。至少,斯科特梅耶斯认为这是事实。

为什么?因为它提供了更好的封装。 IIRC认为类接口应该定义对象所做的事情。助手样式函数是可以用对象完成的事情,而不是对象必须执行的事情。所以他们不属于班级。如果他们在课堂上,他们可以不必要地访问私人成员,从而扩大该成员的隐藏范围,从而增加私人成员以任何方式变化时需要触及的代码行数。

当然,如果你想访问受保护的成员,那么你必须继承。如果你想要的方法需要每个实例的状态,但不能访问受保护的成员,那么你可以根据喜好继承或复合 - 前者通常更简洁,但是如果关系不是真的“是” 。

相关问题