oo设计问题

lostbarque 2010-03-31 10:29:42
比如设计一个游戏,有人(person)和怪物(monster)2种对象,因为各自的属性都不相同,所以有各自不同的各种属性操作方法。现在要设计战斗的对象,可能会person vs monster或者person vs person ,但是在战斗对象里我不想区分是人打人还是人打怪,我先是设计一个fighter的类让person和monster继承,那么打的时候只要fighter hit fighter就行了,但是这样不合理,person不完全是一个fighter。如果person里包含fighter也不太合理,因为fighter的某些操作是会影响到person的,这也违反设计原则,求一个好点的方案
...全文
281 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zkx2321 2011-10-18
  • 打赏
  • 举报
回复
其实LZ,你想想你运行的这个游戏程序。实际是在运行什么????

实际上程序中的那些是人和动物吗?????

那些不就是图片或者窗口吗??

你要判断“谁打谁”???这是问题的本质吗???说白了不就是两个图或者窗口有边界交集吗???

如果你明白了这个。那么什么所谓的打不打的不就很好判断了吗?
wunglee 2011-10-11
  • 打赏
  • 举报
回复
支持boltzjf,我认为fighter就是一个独立的类,可以将person和monster作为构造函数的参数传入,然后两个fighter就可以开打了
水晶平衡木 2011-10-06
  • 打赏
  • 举报
回复
兄弟们,听我说,人和怪物在平时都不是Fighter,只有在打架的时候才是,在打架的时候,他们都只是在扮演Fighter角色。这是一个典型的“角色扮演”问题。让他们在打架的时候再一人带上一个Fighter的帽子打去吧,呵呵。

面向对象分析与设计的问题欢迎莅临小弟的博客共同探讨:http://blog.sina.com.cn/crystalbalance
bluesage 2011-04-30
  • 打赏
  • 举报
回复
Person和Monster是操作的主体,而fight显然是个动作,所以Person和Monster应该设计成类,fight应该设计成接口。
至于说fight的时候会影响到主体类,则是在实现fight的类里,传入主体类,执行fight的时候修改主体的相关属性
cloudtian101 2011-03-24
  • 打赏
  • 举报
回复
同意chosen0ne的看法,楼主的问题就有问题,根据里氏代换原则,子类能替代父类,如果不能替代要重新考虑他们的关系,不管是继承于类还是接口。不明白楼主为什么认为person不能替换fighter
wateryh 2011-02-15
  • 打赏
  • 举报
回复
好老的帖子啊,
..............

我想问为什么一定要继承Fighter类呢,

Person和Monster是个实体,有各种属性生命值什么的,
可以说他们具有可以战斗的属性,可以用一些策略计算在战斗时表现的攻击力,
攻击,就是Fighter服务发出一个请求

Fighter应该表现为一种服务,
对传入的对象的战斗状态计算,受影响的范围,改变被攻击对象的属性,

而真正的战斗,
是两个或多个对象不断的攻击

nosort 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 chosen0ne 的回复:]
首先,Person和Monster应该都是Fighter的子类,不过Fighter具体是设计成接口,还是抽象类,这就需要看Fighter的实现。如果Person和Monster具有共同的属性或方法,则出于代码复用的角度,应该将Fighter设计成抽象类;否则Fighter设计成接口。
还有一种方案是将Fighter设计成接口,然后对Fighter进行默认实现DefaultFighter,在Def……
[/Quote]

膜拜高手
yfk 2011-01-18
  • 打赏
  • 举报
回复
LZ的思想应该是不想由于person的fighter这个特性反过来破坏person本身的封装性。
同意LS各位的观点,如果person具有fighter这个特性,是不是把fighter这个特性也放到person里面去。

LZ的想法个人感觉可以用类似于decorate模式去解决。

class person
{
....
}

class monster
{
....
}

class fighter
{
....
}

class personFighter: public: fighter
{
public:
personFighter(person* per)
{
_personFighter=per;
}
private:
person* _personFighter;
}

class monsterFighter: public fighter
{
public:
monsterFighter(monster* mon)
{
_monsterFighter=mon
}
private:
monster* _monsterFighter;
}
void fight(fighter* f1, fighter* f2)
{
....
}
void main()
{
person p1;
moster m1;

fighter* pf1 = new personFighter(&p1);
fighter* mf1 = new monsterFighter(&m1);

fight(pf1,mf1);

}
InfidelX 2011-01-17
  • 打赏
  • 举报
回复
考虑下策略模式。
chosen0ne 2011-01-12
  • 打赏
  • 举报
回复
补充下,Person和Monster需要继承DefaultFighter
chosen0ne 2011-01-12
  • 打赏
  • 举报
回复
首先,Person和Monster应该都是Fighter的子类,不过Fighter具体是设计成接口,还是抽象类,这就需要看Fighter的实现。如果Person和Monster具有共同的属性或方法,则出于代码复用的角度,应该将Fighter设计成抽象类;否则Fighter设计成接口。
还有一种方案是将Fighter设计成接口,然后对Fighter进行默认实现DefaultFighter,在DefaultFighter中实现子类的公共代码已实现复用。
showerXP 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dolphin_001 的回复:]
既然(person)和怪物(monster)都能fight,说明他们都是fighter,所以继承于抽象基类fighter是没错的,关键在于fighter要够抽象,把他俩属于fighter的共性都加进来。关键一个函数是 bool hit(fighter & f);
[/Quote]
都有fight的话可以看成他们的共性。所以我倾向于IObject有个fight()操作,person和monster继承IObjet。
michaellufhl 2010-10-21
  • 打赏
  • 举报
回复



在设计继承之前先问自己2者是不是"is-a"的关系。
譬如说,person是不是一种fighter? 这样答案就很明确了。
Dolphin_001 2010-08-27
  • 打赏
  • 举报
回复
既然(person)和怪物(monster)都能fight,说明他们都是fighter,所以继承于抽象基类fighter是没错的,关键在于fighter要够抽象,把他俩属于fighter的共性都加进来。关键一个函数是 bool hit(fighter & f);
cxyOOOO 2010-08-27
  • 打赏
  • 举报
回复
从IFighter派生IFighterPerson和IFighterMonster

将CPerson委托给IFighterPerson,CMonster委托给IFighterMonster
IFighterPerson和IFighterMonster互P,就可以认为是IFighter互P了


侯斌 2010-08-04
  • 打赏
  • 举报
回复
可以用组合方式啊。
新建个抽象类,用来表示和什么打VSWho。
再新建个fightable类,在这个类里面定义一个VSWho成员指针,到时候你想和谁打就和谁打了。
kuer_cool 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sinosinux 的回复:]
将fightable抽象成接口。 person和monster分别实现fightable
[/Quote]

这是个不错的设计,支持!
jinlking 2010-04-07
  • 打赏
  • 举报
回复
person里包含fighter也不太合理,因为fighter的某些操作是会影响到person的,这也违反设计原则,求一个好点的方案.

还是fighter是基类,person和monster派生于这个基类。person不完全是一个fighter,因为fighter的某些操作是会影响到person的,肯定啊,person是fight的子类,我觉得是你的fight不够抽象,偏重于monster或者person。
woshixiaowen 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 denieljean 的回复:]
可以让Person和Monster都继承于IObject,而Fighter里面设置两个IObject,这样就可以不分是人与人战斗还是人与怪物战斗了。
[/Quote] 还可意 吧。。。加油吧。。。
donkey301 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 lostbarque 的回复:]
比如设计一个游戏,有人(person)和怪物(monster)2种对象,因为各自的属性都不相同,所以有各自不同的各种属性操作方法。现在要设计战斗的对象,可能会person vs monster或者person vs person ,但是在战斗对象里我不想区分是人打人还是人打怪,我先是设计一个fighter的类让person和monster继承,那么打的时候只要fighter hit fig……
[/Quote]
我觉得person不完全是fighter这是肯定的,这正好说明了person可以从fighter继承。
换个例子好理解点:
cat是animal,dog也是animal,而animal打架可以是cat VS cat, dog VS dog, cat VS dog.
那么显然cat和dog就应该继承于animal
加载更多回复(5)

3,405

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 设计模式
社区管理员
  • 设计模式
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧