#java #generics #inheritance
Вопрос:
У меня есть базовая служба, объявленная как
BaseService<M, S>
У меня есть еще одна служба, которая расширяет базовую службу, объявленную как:
AnimalService extends BaseService<Animal, AnimalStatus>
Теперь мне нужна другая служба для передачи модели Собаки вместо животного(Собака расширяет животное), создание новой службы будет работать отлично:
DogService extends BaseService<Dog, AnimalStatus>
Дело в том, что DogService в основном функционально совпадает с AnimalService, поэтому объявление другой службы только для собаки-это просто повторение кода AnimalService.
Есть ли способ объявить службу DogService, чтобы она могла повторно использовать код в службе животных при использовании новой модели собаки, или существует способ объявить службу AnimalService общим способом, чтобы она также могла принять модель собаки?
Комментарии:
1.
AnimalService<T extends Animal> extends BaseService<T, AnimalStatus>
это бы сработало. Таким образом, мы можем инициализировать его сAnimal
помощью или любого другого подклассаAnimal
(напримерDog
).
Ответ №1:
Я бы рекомендовал определить AnimalService
сам универсальный класс как такой:
AnimalService<T extends Animal> extends BaseService<T, AnimalStatus> {
...
}
Это позволяет нам создавать экземпляры AnimalService
s с расширением типов Animal
и даже Animal
само по себе:
class Animal {
...
}
class Dog extends Animal {
...
}
...
final AnimalService<Animal> animalService = new AnimalService<Animal>();
final AnimalService<Dog> dogService = new AnimalService<Dog>();
В случае , если нам нужен отдельный класс DogService
, чтобы добавить или переопределить некоторые методы, мы также можем определить его как:
class DogService extends AnimalService<Dog> {
...
}