我针对一个问题设计了以下内容:
class Animal {
// ...
}
class Guppy extends Animal { ... }
class Pigeon extends Animal { ... }
class TailedAnimal extends Animal {
// ...
}
class Dog extends TailedAnimal { ... }
class Cat extends TailedAnimal { ... }
class HornedAnimal extends Animal {
// ...
}
class Ram extends HornedAnimal { ... }
public static void main(String[] args) {
Animal a = getSomeAnimal();
a.doSomething();
if (a instanceof TailedAnimal) {
// do something
}
if (a instanceof HornedAnimal) {
// do something else
}
}
Animal、HornedAnimal 和 TailedAnimal 主要用作数据模型。
由于 Java 不支持多重继承,我在创建 Rhinoceros 时遇到了麻烦,它是一种有角和尾部的动物。问了一圈,有人推荐使用组合和接口(interface)。我想出了以下内容:
class Animal {
// ...
}
class Guppy extends Animal { ... }
class Pigeon extends Animal { ... }
class Ram extends Animal implements IHorned { ... }
class Cat extends Animal implements ITailed { ... }
class Dog extends Animal implements ITailed {
BasicTail t = new BasicTail();
public Object getTail() {
return t.getTail();
}
public void setTail(Object in) {
t.setTail(in);
}
}
interface ITailed {
public Object getTail();
public void setTail(Object in);
//...
}
class BasicTail implements ITailed {
Object myTail;
public Object getTail() { return myTail; }
public void setTail(Object t) { myTail = t; }
}
interface IHorned {
// getters and setters
}
public static void main(String[] args) {
Animal a = getSomeAnimal();
a.doSomething();
// how do I check if a is horned or tailed?
}
我的界面有 getter 和 setter。有什么办法可以避免这种情况吗?假设目前没有办法抽象出 Tails 和 Horns 的行为,并且它们主要用作数据持有者。如何确定我的动物是有角的还是有尾部的?
最佳答案
我建议在这里使用策略模式。简而言之:
interface TailedAnimal {
void moveTail();
}
interface HornedAnimal {
void hitWithHorn();
}
class Rhinoceros() implements TailedAnimal, HornedAnimal {
private TailedAnimal tail; //Instantiate it somehow e.g. constructor, setter
private HornedAnimal horn; //Instantiate it somehow e.g. constructor, setter
public void moveTail() {
tail.moveTail();
}
public void hitWithHorn() {
horn.hitWithHorn();
}
}
通过使用它,您可以将行为封装在接口(interface)的具体实现中,并且可以轻松地为一些动物共享完全相同的行为,以及在运行时更改它。
关于java - 使用 Java 中的组合和接口(interface)进行设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4304034/