Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

java interface

648  1 2 все
Kvint постоялец05.07.17 22:27
Kvint
NEW 05.07.17 22:27 

Привет всем.

у меня такой вопрос.

есть интерфейс:


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){}

Это возможно сделать? если да то как?


#1 
GANDJUBAS Ганджубас05.07.17 22:54
GANDJUBAS
05.07.17 22:54 
в ответ Kvint 05.07.17 22:27

Я не знаю, на сколько могут отличаться классы А от В, но чисто по описанию я бы реализовал через Generic.


http://www.quizful.net/post/java-generics-tutorial

#2 
Murr патриот05.07.17 23:57
Murr
NEW 05.07.17 23:57 
в ответ Kvint 05.07.17 22:27

Что то типа TestInterface ti = new TestInterface(BigInteger bi){}

-----

Гы... инстанцировать объект класса интерфейс? Может почитать что-то по Жабе?


Это возможно сделать? если да то как?

-----

Читать - паттерны. Паттерн Фабрика классов.

#3 
Kvint постоялец06.07.17 06:54
Kvint
NEW 06.07.17 06:54 
в ответ GANDJUBAS 05.07.17 22:54

думаю generic не совсем подойдёт в данном случае. Сейчас посмотрю фабрику классов, как советует мур. Ещё есть идея использовать serviceloader.

#4 
MrSanders старожил06.07.17 10:37
NEW 06.07.17 10:37 
в ответ Kvint 06.07.17 06:54

Не надо serviceloader. Фабрика правильное решение. Только аккуратнее, не забывайте что ява язык с "одиночной диспетчеризацией" (single dispatch).

#5 
BorisL0 знакомое лицо06.07.17 12:21
NEW 06.07.17 12:21 
в ответ Kvint 05.07.17 22:27

А так не пойдет?

TestInterface ti = (Ваше условие) ? (new A(value)) : (new B(value));

#6 
Kvint постоялец06.07.17 22:48
Kvint
NEW 06.07.17 22:48 
в ответ BorisL0 06.07.17 12:21

кстати тоже хороший способ. Но у меня будет не только A и B. У меня будет A,B,C,D,E классы.

А вообще мне идея с интерфейсом не очень нравится, тк все классы имеют свои методы, которые в других классах не существуют. Но это идея бетроера. Завтра буду говорить с ним по этому поводу

#7 
AlexNek патриот07.07.17 01:42
AlexNek
NEW 07.07.17 01:42 
в ответ Kvint 06.07.17 06:54

фабоика для "постоянного количества" классов. Сервис лоадер для переменного заранее неизвестного.

Незнаю есть ли в Яве атрибуты для классов, но туда можно было кинуть "ид" для загрузки.

#8 
Kvint постоялец07.07.17 06:56
Kvint
NEW 07.07.17 06:56 
в ответ AlexNek 07.07.17 01:42

имеется ввиду dependency injections?

#9 
AlexNek патриот10.07.17 01:56
AlexNek
NEW 10.07.17 01:56 
в ответ Kvint 07.07.17 06:56

Не нашел как это будет в яве точно выглядеть, на шарпе это примерно так

[MyId(32)]
pulblic Class Test
{
...
}


#10 
Kvint постоялец10.07.17 16:44
Kvint
NEW 10.07.17 16:44 
в ответ AlexNek 10.07.17 01:56

Я поговорил сегодня с Бетроером. Он против dependency injection, говорит что это может повлиять на всю систему. И ему подходит вариант с factory. Но мне не нравится то, что интерфейс будет содержать все методы из всех классов. Например класс A должен будет реализовать методы, которые ему не нужны, а нужны классу B.

#11 
pavel-hh коренной житель10.07.17 17:00
pavel-hh
NEW 10.07.17 17:00 
в ответ Kvint 10.07.17 16:44

по-моему у вас с архитектурой приложения что-то не так, мягко говоря.

Linux is like a Wigwam. No Windows! No Gates! And Apache inside.
#12 
AlexNek патриот10.07.17 18:22
AlexNek
NEW 10.07.17 18:22 
в ответ Kvint 10.07.17 16:44

У Бетроера что очередная параноя на базе ДИ? хаха

https://msdn.microsoft.com/en-us/library/aa288059(v=vs.71)...

Как может номер "привязанный" к классу развалить систему и где он там ДИ увидел? В спецочках наверное.

Не, если очень постарться то можно всё сделать, но это надо сильно стараться спок


Но мне не нравится то, что интерфейс будет содержать все методы из всех классов

Нафига? Интерфес общий, а имплементации различные.

Если нужно в интерфейс выкидывать все методы, то необходимо срочно искать другого Бетроера.

#13 
Kvint постоялец10.07.17 18:47
Kvint
NEW 10.07.17 18:47 
в ответ AlexNek 10.07.17 18:22

ок. Я счас быстро uml накидаю и объясню как это по его мнению выглядеть должно. Я если честно уже не уверен, что мне делать

#14 
Kvint постоялец10.07.17 19:10
Kvint
NEW 10.07.17 19:10 
в ответ Kvint 10.07.17 18:47

#15 
Kvint постоялец10.07.17 19:16
Kvint
NEW 10.07.17 19:16 
в ответ Kvint 10.07.17 19:10

получается, что класс A и B содержат ненужные методы, тк эти методы в интерфейсе. Классам же на верху (SomethingA, SomethingB) нужны только определенные методы. Но эти классы должны знать только интерфейс.

Есть какое-то разумное решение у этой проблемы?

Ps uml набросал на коленке. Извиняюсь за качество

#16 
BorisL0 знакомое лицо10.07.17 20:42
NEW 10.07.17 20:42 
в ответ Kvint 10.07.17 19:10

А зачем методы doA и doB??? В интерфейсе пишете один метод, назовем его do, и в каждом классе реализации (A и B) своя реализация этого метода. Или я что-то не так понял?

#17 
Kvint постоялец10.07.17 20:53
Kvint
NEW 10.07.17 20:53 
в ответ BorisL0 10.07.17 20:42

методы могут быть разные с разными параметрами. Можно конечно попробовать generics, но это огромная работа, тк классов не два а пять и все делают разные вещи

#18 
BorisL0 знакомое лицо10.07.17 21:00
NEW 10.07.17 21:00 
в ответ Kvint 10.07.17 20:53

Тогда, как вариант: пишете еще одну архитектуру классов, т.е. интерфейс и реализации для "параметров", вроде IParameters, ParameterA, ParameterB,... Тогда в методе do для классов A,B,C,...будет один аргумент типа IParam, ну а каждая из реализаций будет использовать свою реализацию параметров ParameterA,...

#19 
AlexNek патриот10.07.17 21:47
AlexNek
NEW 10.07.17 21:47 
в ответ Kvint 10.07.17 18:47
Я если честно уже не уверен, что мне делать

Если не уверены, то нужно делать как шеф хочет, только чтобы было в письменной форме, без всяких вариантов - "а Вы меня не так поняли"


По идее он хочет абстрактную фабрику классов.

https://refactoring.guru/ru/design-patterns/abstract-facto...


https://en.wikipedia.org/wiki/Factory_method_pattern

http://www.oodesign.com/factory-method-pattern.html


методы могут быть разные с разными параметрами.

Понятно... архитектура от того же "Бетроера" смущ

Тогда самое простое, как уже написали: добавляем промежуточный класс/интерфейс для списка параметров. И его пользуем вместо списка различных параметров.

#20 
1 2 все