目前,我有以下课程设计:
AnimalHandler(所有动物的基类)
TigerHandler扩展了AnimalHandler,LionHandler扩展了AnimalHandler,LeopardHandler扩展了AnimalHandler等等。
TigerHandler,LionHandler,LeopardHandler等“HAS A”Tiger,Lion,Leopard等。
现在的问题是:TigerHandler,LionHandler,LeopardHandler等都是一样的(它们有相同的方法等),除了它们分别处理Tiger,Lion,Leopard等类。因此,如果我需要一个名为Cheetah的新动物组,我只需复制任何(Tiger | Lion | Leopard)处理程序,并搜索并替换其“HAS A”类名称,如Tiger,Lion,Leopard。
不是像上面那样复制/创建一个新的CheetahHandler,有没有一种方法(设计)可以使用?比方说,GenericHandler可以处理任何这些“HAS A”类(如Tiger,Lion,Cheetah等)。
答案 0 :(得分:4)
如果您的所有处理程序都提供了类型安全性,并且不执行任何其他操作,则可以使用泛型来代替:
public class AnimalHandler<T extends Animal> {
private T theAnimal;
public T getTheAnimal() {}
// Etc
}
答案 1 :(得分:2)
使用generics是一种更好的方法。
确保所有动物类(Tiger,Lion,Leopard)扩展,让我们说Animal
课程。
然后使用:
public class AnimalHandler<A extends Animal> {
private A animal;
}
在代码中使用animal
。
如果要实例化老虎处理程序,请将其用作:
AnimalHandler<Tiger> tigerHandler = new AnimalHandler<>();
答案 2 :(得分:0)
关于如何在每个处理程序中使用Tiger,Lion,Leopard类的一些细节
- 如果方法接口完全相同,只有内部功能不同
- 如果Animalhandler上有扩展,那么你在childHandlers内部进行了
然后,你应该让AnimalHandler成为一个抽象类(实现iAnimalHandler)并使用泛型来处理Animal(每个Tiger,Lion,Leopard的超级类)
答案 3 :(得分: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
}
}