java interface
Привет всем.
у меня такой вопрос.
есть интерфейс:
public interface TestInterface {}
есть два класса, которые его имплементируют:
public class A implements TestInterface{
public A(BigInteger value){
System.out.println("This is A");
}
}
public class B implements TestInterface{
public B(BigDecimal value){
System.out.println("This is B");
}
}
Нужно что бы в зависимости от параметра (тут BigInteger и BigDecimal) создавался конкретный объект.
Что то типа TestInterface ti = new TestInterface(BigInteger bi){}
Это возможно сделать? если да то как?
Я не знаю, на сколько могут отличаться классы А от В, но чисто по описанию я бы реализовал через Generic.
Что то типа TestInterface ti = new TestInterface(BigInteger bi){}
-----
Гы... инстанцировать объект класса интерфейс? Может почитать что-то по Жабе?
Это возможно сделать? если да то как?
-----
Читать - паттерны. Паттерн Фабрика классов.
думаю generic не совсем подойдёт в данном случае. Сейчас посмотрю фабрику классов, как советует мур. Ещё есть идея использовать serviceloader.
Не надо serviceloader. Фабрика правильное решение. Только аккуратнее, не забывайте что ява язык с "одиночной диспетчеризацией" (single dispatch).
кстати тоже хороший способ. Но у меня будет не только A и B. У меня будет A,B,C,D,E классы.
А вообще мне идея с интерфейсом не очень нравится, тк все классы имеют свои методы, которые в других классах не существуют. Но это идея бетроера. Завтра буду говорить с ним по этому поводу
фабоика для "постоянного количества" классов. Сервис лоадер для переменного заранее неизвестного.
Незнаю есть ли в Яве атрибуты для классов, но туда можно было кинуть "ид" для загрузки.
Не нашел как это будет в яве точно выглядеть, на шарпе это примерно так
[MyId(32)]
pulblic Class Test
{
...
}Я поговорил сегодня с Бетроером. Он против dependency injection, говорит что это может повлиять на всю систему. И ему подходит вариант с factory. Но мне не нравится то, что интерфейс будет содержать все методы из всех классов. Например класс A должен будет реализовать методы, которые ему не нужны, а нужны классу B.
по-моему у вас с архитектурой приложения что-то не так, мягко говоря.
У Бетроера что очередная параноя на базе ДИ? ![]()
https://msdn.microsoft.com/en-us/library/aa288059(v=vs.71)...
Как может номер "привязанный" к классу развалить систему и где он там ДИ увидел? В спецочках наверное.
Не, если очень постарться то можно всё сделать, но это надо сильно стараться ![]()
Но мне не нравится то, что интерфейс будет содержать все методы из всех классов
Нафига? Интерфес общий, а имплементации различные.
Если нужно в интерфейс выкидывать все методы, то необходимо срочно искать другого Бетроера.
ок. Я счас быстро uml накидаю и объясню как это по его мнению выглядеть должно. Я если честно уже не уверен, что мне делать
получается, что класс A и B содержат ненужные методы, тк эти методы в интерфейсе. Классам же на верху (SomethingA, SomethingB) нужны только определенные методы. Но эти классы должны знать только интерфейс.
Есть какое-то разумное решение у этой проблемы?
Ps uml набросал на коленке. Извиняюсь за качество
А зачем методы doA и doB??? В интерфейсе пишете один метод, назовем его do, и в каждом классе реализации (A и B) своя реализация этого метода. Или я что-то не так понял?
методы могут быть разные с разными параметрами. Можно конечно попробовать generics, но это огромная работа, тк классов не два а пять и все делают разные вещи
Тогда, как вариант: пишете еще одну архитектуру классов, т.е. интерфейс и реализации для "параметров", вроде IParameters, ParameterA, ParameterB,... Тогда в методе do для классов A,B,C,...будет один аргумент типа IParam, ну а каждая из реализаций будет использовать свою реализацию параметров ParameterA,...
Я если честно уже не уверен, что мне делать
Если не уверены, то нужно делать как шеф хочет, только чтобы было в письменной форме, без всяких вариантов - "а Вы меня не так поняли"
По идее он хочет абстрактную фабрику классов.
https://refactoring.guru/ru/design-patterns/abstract-facto...
https://en.wikipedia.org/wiki/Factory_method_pattern
http://www.oodesign.com/factory-method-pattern.html
методы могут быть разные с разными параметрами.
Понятно... архитектура от того же "Бетроера" ![]()
Тогда самое простое, как уже написали: добавляем промежуточный класс/интерфейс для списка параметров. И его пользуем вместо списка различных параметров.





