2016-09-29 37 views
2

嗨,我有这样的情况;去耦多个子类使用的类

enter image description here

我在我的设计不同的项目,所有这些项目对角色的一些具体效果。每个项目都有一个应用函数,因此它可以使用Character对象并更改其功能。但是如果我改变了Character函数,我将不得不按照那个改变所有的Item类。

如何有效地解耦Item和Character?

我打算使用的语言是C++,我不知道Item和Character类中的其他变量和函数。我只是想解耦他们。

+0

在OOP设计中,“Character”会将更改应用于自身。将逻辑分成'Item'和将数据分成'Character'是_procedural programming_而不是OOP。 – jaco0646

回答

0

您可以引入Character将继承的接口(C++中的抽象类)。我们称之为ItemUserItem#apply签名将被更改,以便它将采取ItemUser而不是Character的对象。现在只要它遵守ItemUser合同,您就可以自由更改Character的实施。

0

根据我所了解的,通过阅读您的问题是:您有多个项目类,每个具有关联的效果。影响对象类型的效果应用于另一个为Character的实体。现在你的问题是每当Character类有变化时,你的Item类也需要改变,你想要一个更清晰的方法来避免这种情况。

处理变更的一个好方法是定义明确定义的契约,它不易发生变化。例如,如果我们有一个添加两个整数的功能,后面我们可能会做出更改,以便我们需要添加两个浮点数,稍后我们可能需要用乘法来替换添加操作。在这种情况下,您可以定义一个抽象Compute(INum num1,INum num2):INum作为返回类型。这里INum是类型的抽象,Compute是函数行为的抽象。实际的实现定义了INum和Compute。现在使用我们的代码的代码仅取决于抽象,我们可以在不影响用户代码的情况下自由修改操作和实际类型。

在实施合同时,您可以在不影响使用合同的外部代码的情况下修改内部实施。

您可以定义抽象类ICharacter。对于将来可以更改类型的某些属性,可以使用模板和泛型,或者简单地为属性类型创建接口,并让具体类型实现接口。用接口引用所有的字段。让ICharacter使用Interfaces类型的参数定义公共抽象方法,并将返回类型也定义为Interfaces。

让Item类使用ICharacter并且当您需要按照Item类应用效果时,只需使用定义的常量抽象函数即可。您的角色内部修改现在可以更改而不影响Item类。