#java #interface #polymorphism #overloading #abstract-class
Вопрос:
У меня есть следующий интерфейс:
public interface DataExporter { MultipartFile export() throws IOException; }
И следующий абстрактный класс наследуется от интерфейса:
public abstract class AbstractDataExporterlt;Tgt; implements DataExporter { @Override public MultipartFile export() throws IOException { final Iterablelt;Tgt; entities = getEntities(); // ... } protected abstract Iterablelt;Tgt; getEntities(); }
Затем я реализую export
и getEntities
методы, как показано ниже:
public class ProductExporter extends AbstractDataExporterlt;ProductDTOgt; { @Override protected Iterablelt;ProductDTOgt; getEntities() { // } }
Все, что я работаю без каких-либо проблем, и я вызываю метод экспорта из контроллера, как показано ниже:
private final ProductExporter productExporter; public ResponseEntitylt;Resourcegt; exportProduct() throws IOException { final MultipartFile multipartFile = productExporter.export(); // }
Моя проблема заключается в следующем: когда мне нужен другой класс экспортера , например, CategoryExporter, который принимает параметр, например, an UUID
, как я должен export
правильно перегружать методы getEntities
and? Я перегружен, добавив новые методы, которые принимают параметр, но в этом случае все новые методы также необходимы для добавления ProductExporter без необходимости. Итак, как решить эту проблему?
// ??? what about passing parameter: private final CategoryExporter categoryExporter ; public ResponseEntitylt;Resourcegt; exportCategory(UUID uuid) throws IOException { final MultipartFile multipartFile = categoryExporter.export(uuid); // }
Ответ №1:
Я могу придумать два разумных подхода здесь:
- Не имеют общего
DataExporter
интерфейса. В любом случае клиенту необходимо знать более конкретный тип экспортера, чтобы вызвать его с соответствующими аргументами. - Укажите
DataExporter
параметр типа и задайте егоexport
методу параметр этого типа.ProductExporter
тогда может быть aDataExporterlt;Voidgt;
, и егоexport
метод просто принимаетnull
, в то времяCategoryExporter
как может быть aDataExporterlt;Stringgt;
.
Комментарии:
1. Большое спасибо за хорошие объяснения. Для 2-го подхода я думаю, что это может быть проблемой, если у меня есть несколько аргументов, но все равно может использоваться для 2 значений UUID, например
DataExporterlt;UUID, UUIDgt;
. Это правда?2. Не могли бы вы опубликовать примеры реализации для обоих из 2 подходов, используя мой код выше? Заранее спасибо.