Дизайн с использованием композиции и интерфейсов в Java

Для решения проблемы я разработал следующее:

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, который является Рогатое и хвостатое животное. Поинтересовавшись, кто-то посоветовал использовать композицию и интерфейсы. Я придумал следующее:

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?
}

В моем интерфейсе есть геттеры и сеттеры. Есть ли способ избежать этого? Предполагая, что в настоящее время нет способа абстрагироваться от поведения Tails and Horns, и они используются в основном как держатели данных. Как определить, является ли мое животное рогатым или хвостатым?

7
задан TylerH 10 March 2017 в 17:03
поделиться