假设您有以下内容:
+--------+ +------+
| Animal | | Food |
+-+------+ +----+-+
^ ^
| |
| |
+------+ +-------+
| Deer | | Grass |
+------+ +-------+Deer继承Animal,Grass继承Food。
到目前一切尚好。Animal对象可以吃掉Food对象。
现在让我们把它混在一起。让我们添加一个从Lion继承的Animal。
+--------+ +------+
| Animal | | Food |
+-+-----++ +----+-+
^ ^ ^
| | |
| | |
+------+ +------+ +-------+
| Deer | | Lion | | Grass |
+------+ +------+ +-------+现在我们遇到了一个问题,因为Lion可以同时吃Deer和Grass,但是Deer不是Food,而是Animal。
不使用多重继承,使用面向对象的设计,如何解决这个问题?
FYI:我使用http://www.asciiflow.com创建ASCII图。
发布于 2013-07-20 00:16:07
狮子是动物
汽车有一个轮子
ICanEat
发布于 2013-07-19 20:35:15
OO只是一个隐喻,它是在现实世界之后形成的。但是隐喻只能说到这一点。
通常,在OO中没有正确的建模方法。对于特定领域中的特定问题,有一种正确的方法,即使域对象是相同的,如果您更改了问题,也不应该期望它能很好地工作。
我认为这是最常见的误解。英语。学生们在他们的头几年。OO不是一个通用的解决方案,它只是一个不错的工具,可以很好地模拟您的领域的某些问题。
我没有回答这个问题,正是因为我们缺乏域名信息。但是,考虑到以上情况,您可能能够设计出适合您需要的东西。
发布于 2013-07-19 20:13:05
您希望进一步将动物细分为它们的子类(或者至少在您所做的事情有意义的范围内)。考虑到你正在研究的是看上去像基本动物和两种食物(植物和肉类),使用食肉动物和食草动物来进一步定义动物并保持它们分开是有意义的。这是我为你画的。
+----------------+ +--------------------+
| Animal | | Food |
|----------------|<--+Interfaces+--->|--------------------|
| | | |
+----------------+ +--------------------+
+ + + +
| | Abstract Classes | |
| | | | | |
v v v v v v
+-----------------+ +----------------+ +------------+ +------------+
| Herbivore | | Carnivore | | Plant | | Meat |
|-----------------| |----------------| |------------| |------------|
|Eat(Plant p) | |Eat(Meat m) | | | | |
| | | | | | | |
+-----------------+ +----------------+ +------------+ +------------+
+ + + +
| | | |
v v v v
+-----------------+ +----------------+ +------------+ +------------+
| Deer | | Lion | | Grass | | DeerMeat |
|-----------------| |----------------| |------------| |------------|
|DeerMeat Die() |void Kill(Deer) | | | | |
+-----------------+ +----------------+ +------------+ +------------+
^ ^
| |
| |
Concrete Classes -------+正如您所看到的,它们都公开了eat方法,但是它们所吃的内容会发生变化。狮子现在可以杀死一只鹿,鹿可以死亡并返回DeerMeat,而最初的问题是如何让狮子吃鹿而不是草,这一问题在没有构建整个生态系统的情况下得到了回答。
当然,这很快就会变得有趣,因为鹿也可以被认为是一种肉,但是为了保持简单,我会在鹿下创建一个名为kill()的方法,它返回一只鹿肉,并将其作为一个扩展肉的具体类。
https://softwareengineering.stackexchange.com/questions/205459
复制相似问题