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

面向对象设计面试
EN

Stack Overflow用户
提问于 2009-11-29 12:27:38
回答 11查看 12.4K关注 0票数 9

对解决this问题有什么建议吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-11-29 12:40:16

好吧,这是我想出的一个很好的方法--利用OOP覆盖,子类和超类:

代码语言:javascript
运行
复制
namespace Animals{

    // base class Animal
    class Animal{

     public void eat(Food f){

     }

    }


    class Carnivore extends Animal{

      public void eat(Meat f){

      }

    }

    class Herbivore extends Animal{

      public void eat(Plant f){

      }

    }

    class Omnivore extends Animal{

      public void eat(Food f){

      }
    }

}

namespace Food{

    // base class Food
    class Food{

    }

    class Meat extends Food{

    }

    class Plant extends Food{

    }

}

我从超类Animal创建了草食动物、肉食动物和杂食动物的子类,并用它实际可以吃的食物类型覆盖了eat方法。

所以:

代码语言:javascript
运行
复制
Plant grass = new Plant();
Herbivore deer = new Herbivore();
deer.eat(grass); // ok

Plant grass2 = new Plant();
Carnivore tiger = new Carnivore();
tiger.eat(grass2); // not ok.

Meat deer2 = new Meat();
tiger.eat(deer2); // ok

最后一个问题是,当您指定deer是一个Herbivore时,您不能使它成为供tiger吃的Meat。然而,在一天结束的时候,这应该足以解决面试问题,同时又不会让面试官睡着。

票数 13
EN

Stack Overflow用户

发布于 2009-11-29 12:42:27

Liskov Substitution Principle有一张很棒的海报,上面写着:“如果它看起来像鸭子,叫起来像鸭子,但需要电池,那么你可能搞错了抽象概念。”这就是快速的答案--有些对象既可以是动物也可以是食物,所以除非你愿意走多重继承的路线,否则分类模式就完全错了。

一旦你清除了这个障碍,剩下的就是开放式的了,你可以引入其他的设计原则。例如,您可以添加一个允许使用对象的IEdible接口。您可以采用面向方面的方法,为食肉动物和食草动物添加装饰器,这样就只允许使用正确的对象类。

重点是能够站着思考,能够看到和解释问题的各个方面,并能够很好地沟通。也许不会被“一个正确答案”的限制所困。

票数 8
EN

Stack Overflow用户

发布于 2009-11-29 13:01:11

我会让他把这个去掉。这是一个可怕的抽象。更不用说我们没有得到任何背景信息。抽象概念不是凭空产生的,也不是从“正确”的“想法”中产生的。首先告诉我你想解决什么问题,这样我们就可以评估这个抽象了。

如果没有提供上下文,那么我将假设/构建我自己的上下文:您希望某些类型的对象能够吞噬其他类型的对象。没有更多,没有更少。

创建一个Eatable接口(如果您愿意,也可以将其命名为Food ),由于我们没有任何上下文,因此我假设它是一个玩具控制台程序,它只打印:

代码语言:javascript
运行
复制
<X> ate <Y>

所以这个接口所需要的只是一个getFoodName()方法。

对于错误检查,您可以创建一组isXFoodType方法,例如isGrassFoodType()isMeatFoodType()等。CowEat(Eatable e)实现将检查isGrassFoodType(),当失败时,输出:

代码语言:javascript
运行
复制
"Cow can't eat " + e.getFoodName()
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1814653

复制
相关文章

相似问题

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