对解决this问题有什么建议吗?
发布于 2009-11-29 12:40:16
好吧,这是我想出的一个很好的方法--利用OOP覆盖,子类和超类:
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
方法。
所以:
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
。然而,在一天结束的时候,这应该足以解决面试问题,同时又不会让面试官睡着。
发布于 2009-11-29 12:42:27
Liskov Substitution Principle有一张很棒的海报,上面写着:“如果它看起来像鸭子,叫起来像鸭子,但需要电池,那么你可能搞错了抽象概念。”这就是快速的答案--有些对象既可以是动物也可以是食物,所以除非你愿意走多重继承的路线,否则分类模式就完全错了。
一旦你清除了这个障碍,剩下的就是开放式的了,你可以引入其他的设计原则。例如,您可以添加一个允许使用对象的IEdible接口。您可以采用面向方面的方法,为食肉动物和食草动物添加装饰器,这样就只允许使用正确的对象类。
重点是能够站着思考,能够看到和解释问题的各个方面,并能够很好地沟通。也许不会被“一个正确答案”的限制所困。
发布于 2009-11-29 13:01:11
我会让他把这个去掉。这是一个可怕的抽象。更不用说我们没有得到任何背景信息。抽象概念不是凭空产生的,也不是从“正确”的“想法”中产生的。首先告诉我你想解决什么问题,这样我们就可以评估这个抽象了。
如果没有提供上下文,那么我将假设/构建我自己的上下文:您希望某些类型的对象能够吞噬其他类型的对象。没有更多,没有更少。
创建一个Eatable
接口(如果您愿意,也可以将其命名为Food
),由于我们没有任何上下文,因此我假设它是一个玩具控制台程序,它只打印:
<X> ate <Y>
所以这个接口所需要的只是一个getFoodName()
方法。
对于错误检查,您可以创建一组isXFoodType
方法,例如isGrassFoodType()
、isMeatFoodType()
等。Cow
的Eat(Eatable e)
实现将检查isGrassFoodType()
,当失败时,输出:
"Cow can't eat " + e.getFoodName()
https://stackoverflow.com/questions/1814653
复制相似问题