java - 使用 Java 中的组合和接口(interface)进行设计

标签 java inheritance composition

我针对一个问题设计了以下内容:

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/

相关文章:

java - 如何在不同实现/类/等的java中调用toString()

javascript - JavaScript 中的方法继承

ios - 共享变量的组合而不是继承

java - 限制打开的最大文件大小

java - 将公共(public) API 转换为内部胶水代码时避免强制转换

java - 没有组件的 WindowBuilder 调色板

java - 替换 Java 中字符串中所有不一致的字符

java - 我只想在多级继承中调用子类构造函数?

组合类的c++复制构造函数

c++ - C++ 中的构造函数