Вопрос в следующем:
возможно ли в Delphi (хоть самой в последней версии) реализовать множественное наследование интерфейсов от интерфейсов?
Поясняю на примере. Нужен интерфейс I12, наследующий от интерфейсов I1, I2.
program MultiInterfaces;
{$APPTYPE CONSOLE}uses
SysUtils;
Type
I1 = interface
procedure Method1;
end;
I2 = interface
procedure Method2;
end;
I12 = interface (I1, I2)
procedure Method;
end;
begin
end.
При попытке скомпилировать данный код, Delphi заставляет закрыть скобку после I1 в объявлении интерфейса I12:
[Error] MultiInterfaces.dpr(18): ')' expected but ',' found
Нечто подобное работает в C#. Неужели в Delphi до такого не дошли? Я ж не от множества классов наследую, и методы у меня не перекрываются.
Re: Множественное наследование интерфейсов в Delphi
Здравствуйте, alm_zone, Вы писали:
a> При попытке скомпилировать данный код, Delphi заставляет закрыть скобку после I1 в объявлении интерфейса I12: a> [Error] MultiInterfaces.dpr(18): ')' expected but ',' found a> Нечто подобное работает в C#. Неужели в Delphi до такого не дошли? Я ж не от множества классов наследую, и методы у меня не перекрываются.
Нет, так делать нельзя. Класс может реализовать множество интерфейсов, но множественного наследования в дельфях нет ни в каком виде.
H>Нет, так делать нельзя. Класс может реализовать множество интерфейсов, но множественного наследования в дельфях нет ни в каком виде.
Ну прямо уж ни в каком. Класс может поддержать множество интерфейсов -это ли не множественное наследование?
Re[3]: Множественное наследование интерфейсов в Delphi
Здравствуйте, Phidel, Вы писали:
P> H>Нет, так делать нельзя. Класс может реализовать множество интерфейсов, но множественного наследования в дельфях нет ни в каком виде.
P> Ну прямо уж ни в каком. Класс может поддержать множество интерфейсов -это ли не множественное наследование?
Конечно нет. Реализация отличается от наследования, не находишь?
Поясню свою мысль.
Что хочет получить автор вопроса? фактически псевдоним для списка I1, I2 — нужно заменить одним идентификатором I12.
Функционально эта подстановка не дает ничего нового, просто сокращенная форма записи.
Re[4]: Множественное наследование интерфейсов в Delphi
P>> H>Нет, так делать нельзя. Класс может реализовать множество интерфейсов, но множественного наследования в дельфях нет ни в каком виде.
P>> Ну прямо уж ни в каком. Класс может поддержать множество интерфейсов -это ли не множественное наследование?
H>Конечно нет. Реализация отличается от наследования, не находишь?
Безусловно. Интерфейс I12 тоже не содержит реализации. Я ниже написал почему введение такой фичи особо никому не нужно, кроме любителей запутать код.
Re[5]: Множественное наследование интерфейсов в Delphi
Здравствуйте, Phidel, Вы писали:
P> P>> Ну прямо уж ни в каком. Класс может поддержать множество интерфейсов -это ли не множественное наследование?
P> H>Конечно нет. Реализация отличается от наследования, не находишь?
P> Безусловно. Интерфейс I12 тоже не содержит реализации.
Говорить о реализации применительно к интерфейсам вообще странно
P> Я ниже написал почему введение такой фичи особо никому не нужно, кроме любителей запутать код.
Я вовсе не оправдываю множественное наследование, и более того, считаю его безусловным злом. Но все же, возможно есть ситуации, когда удобнее работать с одним интерфейсом полученным от объекта, чем с парой-тройкой. Хотя это все очень сильно может зависеть от проектирования. У меня с интерфейсами никогда проблем небыло, как и желания использовать множественное наследование.
Здравствуйте, Phidel, Вы писали:
P>Поясню свою мысль. P>Что хочет получить автор вопроса? фактически псевдоним для списка I1, I2 — нужно заменить одним идентификатором I12. P>Функционально эта подстановка не дает ничего нового, просто сокращенная форма записи.
твое прдложение, как релизовать такой метод:
procedure DoWork(I: I12);
begin
I.Method1();
I.Method2();
I.Method();
end;
остоваясь в рамках статической типизации? и желательно xnj, в дельфи 7 работало? -) Для Delphi >= 2009 в принципе задача решаема.
Re[5]: Множественное наследование интерфейсов в Delphi
J>твое прдложение, как релизовать такой метод:
J>procedure DoWork(I: I12); J>begin J> I.Method1(); J> I.Method2(); J> I.Method(); J>end;
J>остоваясь в рамках статической типизации? и желательно xnj, в дельфи 7 работало? -) Для Delphi >= 2009 в принципе задача решаема.
Мда, просто переписать в другой форме, ничего принципиально не меняя, что кстати сделает архитектуру проекта более прозрачной
procedure DoWork(a: I1; b: I2);
begin
a.Method1();
b.Method2();
.Method(); // не знаю кому там этот метод принадлежит
end;
Re[6]: Множественное наследование интерфейсов в Delphi
H>Я вовсе не оправдываю множественное наследование, и более того, считаю его безусловным злом. Но все же, возможно есть ситуации, когда удобнее работать с одним интерфейсом полученным от объекта, чем с парой-тройкой.
Это да, соглашусь. Однако это вопрос удобства, но не вопрос невозможности сделать что-то. Множественное наследование интерфейсов в делфи есть, ну пусть не так удобно оформлено синтаксически, как в других языках
Re[6]: Множественное наследование интерфейсов в Delphi
J>>остоваясь в рамках статической типизации? и желательно xnj, в дельфи 7 работало? -) Для Delphi >= 2009 в принципе задача решаема. P>Мда, просто переписать в другой форме, ничего принципиально не меняя, что кстати сделает архитектуру проекта более прозрачной
P>procedure DoWork(a: I1; b: I2); P>begin P> a.Method1(); P> b.Method2(); P> .Method(); // не знаю кому там этот метод принадлежит P>end;
Понял, метод принадлежит обоим интерфейсам. Это значит, что он должен быть вынесен в общего предка. Как правило, необходимость добавить общий метод в несколько интерфейсов говорит о слабой продуманности интерфейсов. В данном случае и I1 и Ш2 должен быть предок I0, куда и следует поместить метод Method()
Re[7]: Множественное наследование интерфейсов в Delphi
Здравствуйте, Phidel, Вы писали:
P> H>Я вовсе не оправдываю множественное наследование, и более того, считаю его безусловным злом. Но все же, возможно есть ситуации, когда удобнее работать с одним интерфейсом полученным от объекта, чем с парой-тройкой.
P> Это да, соглашусь. Однако это вопрос удобства, но не вопрос невозможности сделать что-то. Множественное наследование интерфейсов в делфи есть, ну пусть не так удобно оформлено синтаксически, как в других языках
Да нет там никакого множественного наследования Реализация нескольких интерфейсов классом это не множественное наследование, это способ его замещения.
H>Да нет там никакого множественного наследования Реализация нескольких интерфейсов классом это не множественное наследование, это способ его замещения.
OK
Re[4]: Множественное наследование интерфейсов в Delphi
Здравствуйте, Phidel, Вы писали:
P>Что хочет получить автор вопроса? фактически псевдоним для списка I1, I2 — нужно заменить одним идентификатором I12. P>Функционально эта подстановка не дает ничего нового, просто сокращенная форма записи.
Дело в том, что в реальном проекте гораздо все сложнее и объемнее. От I1 и I2 отнаследовано множество классов. И переделывать их у меня нету никакого желания. Тем более это заденет другие проекты со всеми вытекающими последствиями.
Re[5]: Множественное наследование интерфейсов в Delphi
_>Дело в том, что в реальном проекте гораздо все сложнее и объемнее. От I1 и I2 отнаследовано множество классов. И переделывать их у меня нету никакого желания. Тем более это заденет другие проекты со всеми вытекающими последствиями.
Появление нового предка никак не отразится на потомках I1 и I2 — они просто об этом не узнают.
А новый метод по любому поддержать придется во всех отнаследованных классах. Не надо драматизировать.
Re[6]: Множественное наследование интерфейсов в Delphi
Мне надо было, чтобы в наследнике от I1 и I2 не пришлось писать реализацию. Ну вот пока так выкрутился, а там посмотрим.
Спасибо всем за советы! Вы натолкнули меня на решение.
Re[7]: Множественное наследование интерфейсов в Delphi
Здравствуйте, alm_zone, Вы писали:
a> Мне надо было, чтобы в наследнике от I1 и I2 не пришлось писать реализацию. Ну вот пока так выкрутился, а там посмотрим.
А агрегирование объектов и делегирование их интерфейсов не подойдет?
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, alm_zone, Вы писали:
a>> Мне надо было, чтобы в наследнике от I1 и I2 не пришлось писать реализацию. Ну вот пока так выкрутился, а там посмотрим.
H>А агрегирование объектов и делегирование их интерфейсов не подойдет?
Извините, но не совсем понял.
Агрегирование объектов — наследников? Или агрегирование интерфейсов I1 и I2 в один?
Если не трудно, покажите на коде. Спасибо!
Re[9]: Множественное наследование интерфейсов в Delphi
Здравствуйте, alm_zone, Вы писали:
a> a>> Мне надо было, чтобы в наследнике от I1 и I2 не пришлось писать реализацию. Ну вот пока так выкрутился, а там посмотрим.
a> H>А агрегирование объектов и делегирование их интерфейсов не подойдет?
a> Извините, но не совсем понял. a> Агрегирование объектов — наследников? Или агрегирование интерфейсов I1 и I2 в один?
Да, агрегирование объектов. Вместо объекта реализующего все требуемые интерфейсы, просто агрегация реализующих их объектов.
a> Если не трудно, покажите на коде. Спасибо!