嗨,我有这样的情况;去耦多个子类使用的类
我在我的设计不同的项目,所有这些项目对角色的一些具体效果。每个项目都有一个应用函数,因此它可以使用Character对象并更改其功能。但是如果我改变了Character函数,我将不得不按照那个改变所有的Item类。
如何有效地解耦Item和Character?
我打算使用的语言是C++,我不知道Item和Character类中的其他变量和函数。我只是想解耦他们。
嗨,我有这样的情况;去耦多个子类使用的类
我在我的设计不同的项目,所有这些项目对角色的一些具体效果。每个项目都有一个应用函数,因此它可以使用Character对象并更改其功能。但是如果我改变了Character函数,我将不得不按照那个改变所有的Item类。
如何有效地解耦Item和Character?
我打算使用的语言是C++,我不知道Item和Character类中的其他变量和函数。我只是想解耦他们。
您可以引入Character
将继承的接口(C++中的抽象类)。我们称之为ItemUser
。 Item#apply
签名将被更改,以便它将采取ItemUser
而不是Character
的对象。现在只要它遵守ItemUser
合同,您就可以自由更改Character
的实施。
检查装饰设计模式,似乎这种设计模式是你在找什么。链接:Decorator design pattern
根据我所了解的,通过阅读您的问题是:您有多个项目类,每个具有关联的效果。影响对象类型的效果应用于另一个为Character的实体。现在你的问题是每当Character类有变化时,你的Item类也需要改变,你想要一个更清晰的方法来避免这种情况。
处理变更的一个好方法是定义明确定义的契约,它不易发生变化。例如,如果我们有一个添加两个整数的功能,后面我们可能会做出更改,以便我们需要添加两个浮点数,稍后我们可能需要用乘法来替换添加操作。在这种情况下,您可以定义一个抽象Compute(INum num1,INum num2):INum作为返回类型。这里INum是类型的抽象,Compute是函数行为的抽象。实际的实现定义了INum和Compute。现在使用我们的代码的代码仅取决于抽象,我们可以在不影响用户代码的情况下自由修改操作和实际类型。
在实施合同时,您可以在不影响使用合同的外部代码的情况下修改内部实施。
您可以定义抽象类ICharacter。对于将来可以更改类型的某些属性,可以使用模板和泛型,或者简单地为属性类型创建接口,并让具体类型实现接口。用接口引用所有的字段。让ICharacter使用Interfaces类型的参数定义公共抽象方法,并将返回类型也定义为Interfaces。
让Item类使用ICharacter并且当您需要按照Item类应用效果时,只需使用定义的常量抽象函数即可。您的角色内部修改现在可以更改而不影响Item类。
在OOP设计中,“Character”会将更改应用于自身。将逻辑分成'Item'和将数据分成'Character'是_procedural programming_而不是OOP。 – jaco0646