Информация об изменениях

Сообщение Re: Шаблонный код в Java/Kotlin - возможно ли? от 16.10.2023 16:10

Изменено 16.10.2023 16:11 ·

Re: Шаблонный код в Java/Kotlin - возможно ли?
Здравствуйте, rus blood, Вы писали:

RB>Почему нельзя вынести одинаковые поля в общий класс?

Это называется duck typing. И во многих ЯП нет такого принципиально. Т.к. это создаёт неявную связь между типами.
Можно размотать через лямбды:
<T> void printValue(Supplier<String> value) {
  System.out.println(value.get());
}
...
var a = new A();
printValue(a::value);
var b = new B();
printValue(b::value);

По классике ООП можно делать адаптеры (удобно в случае если методов больше одного):
interface ValueAdapter
{
  String value();
  
  ValueAdapter wrapA(A a) {return () -> a.value};
  ValueAdapter wrapB(B b) {return () -> b.value};
}
void printValue(ValueAdapter adapter) {
  System.out.println(adapter.value());
}
var a = ValueAdapter.wrapA(new A());
printValue(a);
var b = ValueAdapter.wrapB(new B());
printValue(b);



Можно через рефлексию. Но лучше не нужно.
Re: Шаблонный код в Java/Kotlin - возможно ли?
Здравствуйте, rus blood, Вы писали:

RB>Почему нельзя вынести одинаковые поля в общий класс?

Это называется duck typing. И во многих ЯП нет такого принципиально. Т.к. это создаёт неявную связь между типами.
Можно размотать через лямбды:
<T> void printValue(Supplier<String> value) {
  System.out.println(value.get());
}
...
var a = new A();
printValue(a::value);
var b = new B();
printValue(b::value);

По классике ООП можно делать адаптеры (удобно в случае если методов больше одного):
interface ValueAdapter
{
  String value();
  
  ValueAdapter wrap(A a) {return () -> a.value};
  ValueAdapter wrap(B b) {return () -> b.value};
}
void printValue(ValueAdapter adapter) {
  System.out.println(adapter.value());
}
var a = ValueAdapter.wrap(new A());
printValue(a);
var b = ValueAdapter.wrap(new B());
printValue(b);



Можно через рефлексию. Но лучше не нужно.