@protalk

Существует ли красивая конструкция для делегирования реализации интерфейса?

Допустим, у нас есть интерфес:
public interface I {
    int a();

    int b();
}


И есть его реализация:
public class IR implements I {

    @Override
    public int a() {
	return 1;
    }

    @Override
    public int b() {
	return 2;
    }

}


Хочется построить класс, который будет так же реализовывать I и для этого делегировать все запросы по I к инстансу IR. Можно сделать через композицию:
public class A implements I {
    IR delegat = new IR();

    @Override
    public int a() {
	return delegat.a();
    }

    @Override
    public int b() {
	return delegat.b();
    }

}


Не красиво. Можно, конечно, через наследование:
public class B extends IR {

}


Но это вносит свои ограничения, например, я не могу менять делегата в процессе жизни. Поэтому хочется через композицию.

Понятно, что Java тут ничем помочь не сможет. А нет ли в других языках конструкций наподобие:
class B implements I {
	IR delegat = new IR();

	implements I by delegate; 
}
  • Вопрос задан
  • 166 просмотров
Пригласить эксперта
Ответы на вопрос 1
Не совсем понятно, чего вы хотите. Вернее, чего хотите - понятно, непонятно - почему.

Если вы хотите абсолютно все методы делегировать к инстансу IR - то почему бы вам просто не возвращать инстанс IR через интерфейс I из объекта A - зачем самому A реализовывать I?

Если же посредничество A все-таки необходимо, то значит, что вы хотите дать этому какую-то смысловую нагрузку. Т.е. раз вам хочется, чтобы A сам реализовал I, то значит вам хочется, чтобы он скрывал факт того, что вызовы на самом деле делегируются к инстансу IR.

Раз вы хотите, чтобы факт делегирования скрывался от клиента класса A, то вероятно, со временем, вы захотите поменять логику делегирования, и делегировать, например, не к IR, а к другой реализации интерфейса I (иначе зачем вам такое сокрытие факта делегирования к IR). А раз так, то вполне логично, что вы должны явно реализовать методы, делегирующие себя к методам IR.

К чему я это всё? Конечно, можно себе представить, что код делегирования генерируется автоматически на основе конструкции вроде вашей (implements I by delegate), однако: а) это довольно частный случай, чтобы добавлять в язык синтаксический сахар для этого, плюс наверняка возникнет ряд вопросов реализации, на которые не будет однозначного ответа; б) я думаю такое реализуемо в языках с мощными макросами, но мне приходят в голову только те, которые вы врядли будете использовать, например Nemerle или Lisp. А, ну и на препроцессоре C++ такое можно сделать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы