0

目前,我有以下课程设计:

  1. AnimalHandler(所有动物的基类)

  2. TigerHandler 扩展了 AnimalHandler,LionHandler 扩展了 AnimalHandler,LeopardHandler 扩展了 AnimalHandler 等等。

  3. TigerHandler、LionHandler、LeopardHandler 等“有”Tiger、Lion、Leopard 等。

现在的问题是:TigerHandler、LionHandler、LeopardHandler 等都是相同的(它们具有相同的方法等),只是它们分别处理 Tiger、Lion、Leopard 等类。因此,如果我需要一个名为 Cheetah 的新动物组,我只需复制任何 (Tiger|Lion|Leopard)Handler 并搜索并替换其“HAS A”类名称,如 Tiger、Lion、Leopard。

不是像上面那样复制/创建一个新的 CheetahHandler,有没有我可以使用的方法(设计)?比如,可以处理任何这些“HAS A”类(如 Tiger、Lion、Cheetah 等)的 GenericHandler。

4

4 回答 4

4

如果您的所有处理程序只提供类型安全,而不做其他任何事情,则可以使用泛型代替:

public class AnimalHandler<T extends Animal> {

    private T theAnimal;

    public T getTheAnimal() {} 

    // Etc

}
于 2013-04-30T06:02:42.593 回答
2

使用泛型是一种更好的方法。

确保所有动物类(老虎、狮子、豹)都扩展了让我们说一个Animal类。然后使用:

public class AnimalHandler<A extends Animal> {
    private A animal;
}

animal在您的代码中使用。

当您想实例化老虎处理程序时,请将其用作:

AnimalHandler<Tiger> tigerHandler = new AnimalHandler<>();
于 2013-04-30T06:02:27.133 回答
0

正如其他人所指出的,泛型是一种很好的方法,或者您可以使用策略模式:

   class Animalhandler {
      List<Animal> animals;
      // add, remove and do stuff with animals
   }

    interface Animal {
        void makeSound();
    }
    class Cat extends Animal {
        public void makeSound() {
        // meow
        }
    }
于 2013-04-30T06:13:25.043 回答
0

关于如何在每个处理程序中使用每个 Tiger、Lion、Leopard 类的一些细节

-- 如果方法接口都一样,只是内部功能不同

-- 如果您在 childHandlers 中对 Animalhandler 进行了扩展

然后,您应该使 AnimalHandler 成为一个抽象类(实现 iAnimalHandler)并使用泛型来处理 Animal(每个 Tiger、Lion、Leopard 的超类)

于 2013-04-30T06:06:52.523 回答