Множественное наследование интерфейсов в Delphi
От: alm_zone Украина  
Дата: 15.09.11 10:48
Оценка:
Вопрос в следующем:
возможно ли в 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
От: hattab  
Дата: 15.09.11 10:58
Оценка:
Здравствуйте, alm_zone, Вы писали:

a> При попытке скомпилировать данный код, Delphi заставляет закрыть скобку после I1 в объявлении интерфейса I12:

a> [Error] MultiInterfaces.dpr(18): ')' expected but ',' found
a> Нечто подобное работает в C#. Неужели в Delphi до такого не дошли? Я ж не от множества классов наследую, и методы у меня не перекрываются.

Нет, так делать нельзя. Класс может реализовать множество интерфейсов, но множественного наследования в дельфях нет ни в каком виде.
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[2]: Множественное наследование интерфейсов в Delphi
От: Phidel  
Дата: 15.09.11 11:10
Оценка:
H>Нет, так делать нельзя. Класс может реализовать множество интерфейсов, но множественного наследования в дельфях нет ни в каком виде.
Ну прямо уж ни в каком. Класс может поддержать множество интерфейсов -это ли не множественное наследование?
Re[3]: Множественное наследование интерфейсов в Delphi
От: hattab  
Дата: 15.09.11 11:16
Оценка:
Здравствуйте, Phidel, Вы писали:

P> H>Нет, так делать нельзя. Класс может реализовать множество интерфейсов, но множественного наследования в дельфях нет ни в каком виде.


P> Ну прямо уж ни в каком. Класс может поддержать множество интерфейсов -это ли не множественное наследование?


Конечно нет. Реализация отличается от наследования, не находишь?
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[3]: Множественное наследование интерфейсов в Delphi
От: Phidel  
Дата: 15.09.11 11:17
Оценка:
Поясню свою мысль.
Что хочет получить автор вопроса? фактически псевдоним для списка I1, I2 — нужно заменить одним идентификатором I12.
Функционально эта подстановка не дает ничего нового, просто сокращенная форма записи.
Re[4]: Множественное наследование интерфейсов в Delphi
От: Phidel  
Дата: 15.09.11 11:19
Оценка:
P>> H>Нет, так делать нельзя. Класс может реализовать множество интерфейсов, но множественного наследования в дельфях нет ни в каком виде.

P>> Ну прямо уж ни в каком. Класс может поддержать множество интерфейсов -это ли не множественное наследование?


H>Конечно нет. Реализация отличается от наследования, не находишь?

Безусловно. Интерфейс I12 тоже не содержит реализации. Я ниже написал почему введение такой фичи особо никому не нужно, кроме любителей запутать код.
Re[5]: Множественное наследование интерфейсов в Delphi
От: hattab  
Дата: 15.09.11 11:41
Оценка:
Здравствуйте, Phidel, Вы писали:

P> P>> Ну прямо уж ни в каком. Класс может поддержать множество интерфейсов -это ли не множественное наследование?


P> H>Конечно нет. Реализация отличается от наследования, не находишь?


P> Безусловно. Интерфейс I12 тоже не содержит реализации.


Говорить о реализации применительно к интерфейсам вообще странно

P> Я ниже написал почему введение такой фичи особо никому не нужно, кроме любителей запутать код.


Я вовсе не оправдываю множественное наследование, и более того, считаю его безусловным злом. Но все же, возможно есть ситуации, когда удобнее работать с одним интерфейсом полученным от объекта, чем с парой-тройкой. Хотя это все очень сильно может зависеть от проектирования. У меня с интерфейсами никогда проблем небыло, как и желания использовать множественное наследование.
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[4]: Множественное наследование интерфейсов в Delphi
От: Jack128  
Дата: 15.09.11 11:45
Оценка:
Здравствуйте, 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
От: Phidel  
Дата: 15.09.11 11:56
Оценка:
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
От: Phidel  
Дата: 15.09.11 12:00
Оценка:
H>Я вовсе не оправдываю множественное наследование, и более того, считаю его безусловным злом. Но все же, возможно есть ситуации, когда удобнее работать с одним интерфейсом полученным от объекта, чем с парой-тройкой.
Это да, соглашусь. Однако это вопрос удобства, но не вопрос невозможности сделать что-то. Множественное наследование интерфейсов в делфи есть, ну пусть не так удобно оформлено синтаксически, как в других языках
Re[6]: Множественное наследование интерфейсов в Delphi
От: Phidel  
Дата: 15.09.11 12:09
Оценка:
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
От: hattab  
Дата: 15.09.11 12:14
Оценка:
Здравствуйте, Phidel, Вы писали:

P> H>Я вовсе не оправдываю множественное наследование, и более того, считаю его безусловным злом. Но все же, возможно есть ситуации, когда удобнее работать с одним интерфейсом полученным от объекта, чем с парой-тройкой.


P> Это да, соглашусь. Однако это вопрос удобства, но не вопрос невозможности сделать что-то. Множественное наследование интерфейсов в делфи есть, ну пусть не так удобно оформлено синтаксически, как в других языках


Да нет там никакого множественного наследования Реализация нескольких интерфейсов классом это не множественное наследование, это способ его замещения.
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[8]: Множественное наследование интерфейсов в Delphi
От: Phidel  
Дата: 15.09.11 12:19
Оценка:
H>Да нет там никакого множественного наследования Реализация нескольких интерфейсов классом это не множественное наследование, это способ его замещения.
OK
Re[4]: Множественное наследование интерфейсов в Delphi
От: alm_zone Украина  
Дата: 15.09.11 12:25
Оценка:
Здравствуйте, Phidel, Вы писали:

P>Что хочет получить автор вопроса? фактически псевдоним для списка I1, I2 — нужно заменить одним идентификатором I12.

P>Функционально эта подстановка не дает ничего нового, просто сокращенная форма записи.

Дело в том, что в реальном проекте гораздо все сложнее и объемнее. От I1 и I2 отнаследовано множество классов. И переделывать их у меня нету никакого желания. Тем более это заденет другие проекты со всеми вытекающими последствиями.
Re[5]: Множественное наследование интерфейсов в Delphi
От: Phidel  
Дата: 15.09.11 12:29
Оценка:
_>Дело в том, что в реальном проекте гораздо все сложнее и объемнее. От I1 и I2 отнаследовано множество классов. И переделывать их у меня нету никакого желания. Тем более это заденет другие проекты со всеми вытекающими последствиями.
Появление нового предка никак не отразится на потомках I1 и I2 — они просто об этом не узнают.
А новый метод по любому поддержать придется во всех отнаследованных классах. Не надо драматизировать.
Re[6]: Множественное наследование интерфейсов в Delphi
От: alm_zone Украина  
Дата: 15.09.11 14:01
Оценка:
Здравствуйте, Phidel, Вы писали:
P>А новый метод по любому поддержать придется во всех отнаследованных классах. Не надо драматизировать.

Короче, пришлось делать типа так:

Type

    I1 = interface
         procedure Method1;
    end;

    I2 = interface
         procedure Method2;
    end;

    T12 = class (TInterfacedObject, I1, I2)
         procedure Method1; virtual; abstract;
         procedure Method2; virtual; abstract;
         procedure Method; virtual; abstract;
    end;


Мне надо было, чтобы в наследнике от I1 и I2 не пришлось писать реализацию. Ну вот пока так выкрутился, а там посмотрим.
Спасибо всем за советы! Вы натолкнули меня на решение.
Re[7]: Множественное наследование интерфейсов в Delphi
От: hattab  
Дата: 15.09.11 14:23
Оценка:
Здравствуйте, alm_zone, Вы писали:

a> Мне надо было, чтобы в наследнике от I1 и I2 не пришлось писать реализацию. Ну вот пока так выкрутился, а там посмотрим.


А агрегирование объектов и делегирование их интерфейсов не подойдет?
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[8]: Множественное наследование интерфейсов в Delphi
От: alm_zone Украина  
Дата: 15.09.11 15:01
Оценка:
Здравствуйте, hattab, Вы писали:

H>Здравствуйте, alm_zone, Вы писали:


a>> Мне надо было, чтобы в наследнике от I1 и I2 не пришлось писать реализацию. Ну вот пока так выкрутился, а там посмотрим.


H>А агрегирование объектов и делегирование их интерфейсов не подойдет?


Извините, но не совсем понял.
Агрегирование объектов — наследников? Или агрегирование интерфейсов I1 и I2 в один?
Если не трудно, покажите на коде. Спасибо!
Re[9]: Множественное наследование интерфейсов в Delphi
От: hattab  
Дата: 15.09.11 15:32
Оценка:
Здравствуйте, alm_zone, Вы писали:

a> a>> Мне надо было, чтобы в наследнике от I1 и I2 не пришлось писать реализацию. Ну вот пока так выкрутился, а там посмотрим.


a> H>А агрегирование объектов и делегирование их интерфейсов не подойдет?


a> Извините, но не совсем понял.

a> Агрегирование объектов — наследников? Или агрегирование интерфейсов I1 и I2 в один?

Да, агрегирование объектов. Вместо объекта реализующего все требуемые интерфейсы, просто агрегация реализующих их объектов.

a> Если не трудно, покажите на коде. Спасибо!


Примерно так:

Type

 IIntf1 = Interface
  Procedure Proc1;
 End;

 IIntf2 = Interface
  Procedure Proc2;
 End;

 TObj1 = Class(TAggregatedObject, IIntf1)
  Procedure Proc1;
 End;

 TObj2 = Class(TAggregatedObject, IIntf2)
  Procedure Proc2;
 End;

 TFinalObj = Class(TInterfacedObject, IIntf1, IIntf2)

  Strict Private

   FObj1 : TObj1;
   FObj2 : TObj2;

   Property Obj1 : TObj1 Read FObj1 Implements IIntf1;
   Property Obj2 : TObj2 Read FObj2 Implements IIntf2;

  Public

   Constructor Create;
   Destructor Destroy; Override;

 End;

Procedure TObj1.Proc1;
Begin
End;

Procedure TObj2.Proc2;
Begin
End;

Constructor TFinalObj.Create;
Begin

 FObj1 := TObj1.Create(Self);
 FObj2 := TObj2.Create(Self);

End;

Destructor TFinalObj.Destroy;
Begin

 FObj1.Free;
 FObj2.Free;

 Inherited;

End;
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[10]: Множественное наследование интерфейсов в Delphi
От: hattab  
Дата: 15.09.11 15:37
Оценка:
Здравствуйте, hattab, Вы писали:

В конструкторе пропустил Inherited;
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[11]: Множественное наследование интерфейсов в Delphi
От: alm_zone Украина  
Дата: 16.09.11 05:48
Оценка:
Здравствуйте, hattab, Вы писали:

H>В конструкторе пропустил Inherited;


Спасибо за Ваше решение!
Была у меня мысль через implements написать, но другое решение (указанное выше) быстрее пришло в голову.
Еще раз спасибо, обязательно воспользуюсь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.