首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象设计

面向对象设计
EN

Software Engineering用户
提问于 2013-07-19 20:04:43
回答 12查看 3.6K关注 0票数 23

假设您有以下内容:

代码语言:javascript
复制
     +--------+     +------+
     | Animal |     | Food |
     +-+------+     +----+-+
       ^                 ^
       |                 |
       |                 |
  +------+              +-------+
  | Deer |              | Grass |
  +------+              +-------+

Deer继承AnimalGrass继承Food

到目前一切尚好。Animal对象可以吃掉Food对象。

现在让我们把它混在一起。让我们添加一个从Lion继承的Animal

代码语言:javascript
复制
     +--------+     +------+
     | Animal |     | Food |
     +-+-----++     +----+-+
       ^     ^           ^
       |     |           |
       |     |           |
  +------+ +------+     +-------+
  | Deer | | Lion |     | Grass |
  +------+ +------+     +-------+

现在我们遇到了一个问题,因为Lion可以同时吃DeerGrass,但是Deer不是Food,而是Animal

不使用多重继承,使用面向对象的设计,如何解决这个问题?

FYI:我使用http://www.asciiflow.com创建ASCII图。

EN

回答 12

Software Engineering用户

回答已采纳

发布于 2013-07-20 00:16:07

是关系=继承

狮子是动物

有一个关系=复合

汽车有一个轮子

可以执行关系=接口

ICanEat

票数 38
EN

Software Engineering用户

发布于 2013-07-19 20:35:15

OO只是一个隐喻,它是在现实世界之后形成的。但是隐喻只能说到这一点。

通常,在OO中没有正确的建模方法。对于特定领域中的特定问题,有一种正确的方法,即使域对象是相同的,如果您更改了问题,也不应该期望它能很好地工作。

我认为这是最常见的误解。英语。学生们在他们的头几年。OO不是一个通用的解决方案,它只是一个不错的工具,可以很好地模拟您的领域的某些问题。

我没有回答这个问题,正是因为我们缺乏域名信息。但是,考虑到以上情况,您可能能够设计出适合您需要的东西。

票数 13
EN

Software Engineering用户

发布于 2013-07-19 20:13:05

您希望进一步将动物细分为它们的子类(或者至少在您所做的事情有意义的范围内)。考虑到你正在研究的是看上去像基本动物和两种食物(植物和肉类),使用食肉动物和食草动物来进一步定义动物并保持它们分开是有意义的。这是我为你画的。

代码语言:javascript
复制
             +----------------+                   +--------------------+
             |    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()的方法,它返回一只鹿肉,并将其作为一个扩展肉的具体类。

票数 10
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/205459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档