powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
25 сообщений из 28, страница 1 из 2
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40005658
Maxim.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
возникла архитектурная проблема, в упрощенном варианте я нарисовал картинку(см. спойлер):

для цитирования, повторяю суть в текстовом виде:
Класс “Родитель” содержит базовые Атрибуты и Функционал.
Есть N разных “Дополнений”, которые дополняют “Родителя” своими Атрибутами и Функционалом.
Важно, что “Дополнения” знают только о “Родителе”, и НЕ знают о других “Дополнениях”

Вопрос:
Как получить класс “Наследник_XYZ”, который наследуется от “Родителя” и включает “Дополнения” X, Y, Z ?

К сожалению, в Delphi нет множественного наследования, поэтому загвоздка в том, как оформлять эти “Дополнения”, чтоб в итоговый “Наследник“ попала бы только 1(общая) копия “Родителя“?
Рассматриваются любые варианты: Агрегация, Интерфейсы, Наследование, Примеси, Инклуды ...

Спасибо.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40005669
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim.K
Как получить класс “Наследник_XYZ”
Получить КЛАСС или все таки ОБЪЕКТ?

Нужно получить ТОЛЬКО X, Y, Z или в получаемом объекте могут быть и другие методы из других дополнений?
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40005688
Maxim.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Получить КЛАСС или все таки ОБЪЕКТ?

Итоговый "Наследник" примет форму Объекта, т.е. экземпляра какого-то Класса.
А вот "Дополнения" не обязаны быть классами, и могут быть оформлены в каком-то ином виде(если это поможет).

_Vasilisk_
Нужно получить ТОЛЬКО X, Y, Z или в получаемом объекте могут быть и другие методы из других дополнений?

Строго как на картинке.
"Наследник_XYZ" содержит(собирается) из "Родителя" и "Дополнений" X, Y, Z. Все остальные "Дополнения" не должны попасть в "Наследник".
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40005715
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда делаем все на интерфейсах.

объявляем интерфейсы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
IMain = interface
  ['{.....}']
  .........
end;

IAppend1 = interface
  ['{.....}']
  .........
end;

IAppendN = interface
  ['{.....}']
  .........
end;


реализация
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
TMain = class(TInterfacedObject, IInterface, IMain)
strict private
  FAppends: TObjectList;
  ..........
protected
  { IInterface }
  function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
public
  constructor Create;
  destructor Destroy;
  procedure AddAppend(AAppend: TObject);
end;

TAppend1 = class(TAggregatedObject, IAppend1)
strict private
  FMain: TMain;
public
  constructor Create(AMain: TMain);
  .......
end;

constructor TMain.Create;
begin
  inherited Create;
  FAppends := TObjectList.Create(True);
end;

destructor TMain.Destroy;
begin
  FAppends.Free;
  inherited Destroy;
end;

procedure TMain.AddAppend(AAppend: TObject);
begin
  FAppends.Add(AAppend);
end;

function TMain.QueryInterface(const IID: TGUID; out Obj): HResult; 
var
  Li: Integer;
begin
  Result := S_OK;
  if GetInterface(IID, Obj) then
    Exit;
  for Li := 0 to FAppends.Count - 1 do begin
    if FAppends[Li].GetInterface(IID, Obj) then
      Exit;
  end;
  Result := E_NOINTERFACE;
end;

constructor TAppend1.Create(AMain: TMain);
begin
  inherited Create(AMain);
  FMain := AMain;
end;


конструирование
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function GetXYZ: IMain;
var
  LMain: TMain;
begin
  LMain := TMain.Create;
  Result := LMain;
  LMain.AddAppend(TAppendX.Create(LMain));
  LMain.AddAppend(TAppendY.Create(LMain));
  LMain.AddAppend(TAppendZ.Create(LMain));
end;


использование
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  LMain: IMain;
  LAppendx: IAppendX;
begin
  LMain := GetMainXYZ;
  LAppendX := LMain as IAppendX;
end;

...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40005739
Maxim.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Тогда делаем все на интерфейсах.

Большое спасибо.
Очень полезная информация. Но подозреваю, что Вы привели решение более "сложной" задачи, чем я пытаюсь решить(моя вина, что плохо объяснил).
Не требуется собирать Объект в рантайме, нужно всего лишь на этапе программирования так объявить(составить) Класс-Наследник, чтоб в рантайме он уже был готов к работе(без дополнительной сборки).
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40005759
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim.K
К сожалению, в Delphi нет множественного наследования

Лучшее приближение к множественному наследованию, которое есть в Delphi - это директива implements. Решение Вашей задачи выглядит примерно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
type
  Родитель = class
    ...
  end;

  ИДополнение1 = interface
    ...
  end;

  Дополнение1 = class
    ...
  end;

  ИДополнение2 = interface
    ...
  end;

  Дополнение2 = class
    ...
  end;

  Потомок = class(Родитель, ИДополнение1, ИДополнение2)
  private
    Доп1: ИДополнение1;
    Доп2: ИДополнение2;
    property Dummy1: ИДополнение1 read Доп1 implements ИДополнение1;
    property Dummy2: ИДополнение1 read Доп2 implements ИДополнение2;
    ...
  end;
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40005766
Maxim.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer

это директива implements.

Большое Спасибо.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006171
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Maxim.K
К сожалению, в Delphi нет множественного наследования

Лучшее приближение к множественному наследованию, которое есть в Delphi - это директива implements. Решение Вашей задачи выглядит примерно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
type
  Родитель = class
    ...
  end;

  ИДополнение1 = interface
    ...
  end;

  Дополнение1 = class
    ...
  end;

  ИДополнение2 = interface
    ...
  end;

  Дополнение2 = class
    ...
  end;

  Потомок = class(Родитель, ИДополнение1, ИДополнение2)
  private
    Доп1: ИДополнение1;
    Доп2: ИДополнение2;
    property Dummy1: ИДополнение1 read Доп1 implements ИДополнение1;
    property Dummy2: ИДополнение1 read Доп2 implements ИДополнение2;
    ...
  end;



Этот способ противоречит условию задачи
Maxim.K
загвоздка в том, как оформлять эти “Дополнения”, чтоб в итоговый “Наследник“ попала бы только 1(общая) копия “Родителя“?
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006189
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function GetXYZ: IMain;
var
  LMain: TMain;
begin
  LMain := TMain.Create;
  Result := LMain;
  LMain.AddAppend(TAppendX.Create(LMain));
  LMain.AddAppend(TAppendY.Create(LMain));
  LMain.AddAppend(TAppendZ.Create(LMain));
end;


А смешивать объектные и интерфейсные ссылки - это нормально?
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006195
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian
Этот способ противоречит условию задачи

Неверно.

alekcvp
А смешивать объектные и интерфейсные ссылки - это нормально?

Если понимать, что делаешь, то почему нет?
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006214
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer

Неверно.


только 1 ( общая ) копия “Родителя“
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006218
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian
softwarer

Неверно.


только 1 ( общая ) копия “Родителя“

Только одна общая копия родителя.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006280
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer

Только одна общая копия родителя.

Действительно, копия Родителя одна, поскольку Дополнения не наследуются от Родителя.
Но тогда как обстоит с этим: “Дополнения” знают о “Родителе” и дополняют “Родителя” своими Атрибутами и Функционалом?
Мне думается, на основании этого, (хотя могу ошибаться), что Дополнения используют базовые Атрибуты и Функционал, или базовые Атрибуты и Функционал включены в Дополнения.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006283
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian
Но тогда как обстоит с этим: “Дополнения” знают о “Родителе”

Например, ссылка на родителя в дополнении.

Uridian
и дополняют “Родителя” своими Атрибутами и Функционалом?

Потомок.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006295
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Потомок.

Потомок (каждое Дополнение) содержит в себе собственную копию родителя, следовательно "Наследник" будет содержать несколько приватных копий.

softwarer
Например, ссылка на родителя в дополнении.

Пожалуй, только это подходит, с уточнением: ссылка на один и тот же экземпляр родителя для всех Дополнений, реализованных в Наследнике.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006303
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian
Потомок (каждое Дополнение)

См. выше.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006333
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim.K

Добрый день,
возникла архитектурная проблема


Вот мне всегда было интересно, что же за ИИ^3 вы там пишите...
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006340
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А смешивать объектные и интерфейсные ссылки - это нормально?
Вполне. А почему нет? Только нужно четко понимать, где и когда меняется RefCount у интерфейса
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006443
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim.K
_Vasilisk_
Тогда делаем все на интерфейсах.

Большое спасибо.
Очень полезная информация. Но подозреваю, что Вы привели решение более "сложной" задачи, чем я пытаюсь решить(моя вина, что плохо объяснил).
Не требуется собирать Объект в рантайме, нужно всего лишь на этапе программирования так объявить(составить) Класс-Наследник, чтоб в рантайме он уже был готов к работе(без дополнительной сборки).
поддержка интерфейсов и есть множественное наследование в понятии C++, вот только автоматом требуется подсчёт ссылок, нет "удочерения методов и полей" и разруливать реализацию нужно вручную.

я так понимаю, что вам нужно что бы автоматом все методы объекта-дополнения стали методами класса

а зачем?
обычная практика просто вынести свойство с "нужным дополнением" и напрямую указывать его вызовы
н-р, Form.Canvas.{...}
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006490
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если я правильно понял задачу, то просто надо объявить в protected
группу internal методов и в наследниках просто создавать публичные методы произвольно, используя эти internal методы

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
  TBaseColumnAdapter = Class Abstract(TListItem, IBaseColumnAdapter, IWidgetBase)
  Strict private
    _captionFunction: TModelFunctionString;
    _canVisibleFunction: TModelFunctionBoolean;
    _summaryDefaultFunction: TModelFunctionString;
    _hasSummaryConstructorDefault: boolean;
    _hasSummaryDefaultFunction: Boolean;
    FBand: TCxGridBand;
    FUpperFieldName: String;
    function  GetSummaryKind: TCxSummaryKind;
    function  GetIsData: Boolean;
    function  GetCaption: String;
    procedure SetCaption(const Value: String);
    Function  GetWidgetControllerType: TWidgetValidatorType;
  private
    function GetColumn: TCxGridColumn;
    function GetHasSortOrder: Boolean;
  Protected
    _summaryConstructor: TSummaryConstructor;
    _summaryConstructorProc: TSummaryConstructorProc;
    _editEntity: TListItem;
    _forEditValue: Variant;
    _keyFieldName: String;
    FFactory: TGridFactory;
    FExcelSettings: TClassExcelInternationalSetting;
//    FIsBinded: Boolean;
    FColumn: TcxGridColumn; // ссылка
    FColumnAdapterType: TColumnAdapterType;
    FAlignment: TAlignment;
    FVAlign: TcxEditVertAlignment;

    FHasCustomData: Boolean;
    FHasCustomSort: Boolean;
    FCaption: String;
    FFieldName: String;
    FPropertyName: String;
    FHasMono: Boolean;
    FMonoWidth: Integer;
    FHasFixed: Boolean;
    FIsSizing: Boolean;
    FHasHide: Boolean;
    FHasTech: Boolean;
    FHasAlignment: Boolean;
    FHasGrouped: Boolean;
    FHasMerging: Boolean;
    FGroupIndex: Integer;
    FHasSortOrder: Boolean;
    FSortOrder: TDxSortOrder;
    FSortIndex: Integer;
    FHasDisableSort: Boolean;
    FHasDisableGroup: Boolean;
    FHasDisableGroupFooter: Boolean;
    FHasWidth: Boolean;
    FWidth: Integer;
    FHasBand: Boolean;
    FIndexBand: Integer;
    FFirstFiredPropertiesForEdit: Boolean;
    Function GetSummaryDefaultText(): String;

    Procedure SetCaptionFunction(value: TModelFunctionString);
    Procedure SetCanVisibleFunction(value: TModelFunctionBoolean);

    Procedure SetSummaryDefaultFunction(value: TModelFunctionString);
    Procedure SetSummaryConstructorProc(value : TSummaryConstructorProc);
    Procedure NotifyOnModelChanged(); Virtual;
    Procedure SetInternalHide();
    Procedure SetInternalShow();
    Procedure SetInternalTech();
    Procedure SetInternalFixed();
    Procedure SetInternalHorzSizing(Value: Boolean);
    Procedure SetInternalMono(Width: Integer);
    Procedure SetInternalGrouped(GroupIndex: Integer);
    Procedure SetInternalAlignment(Alignment: TAlignment);
    Procedure SetInternalUnboundMode(ValueType: TCxValueTypeClass);
    Procedure SetInternalSortOrder(SortOrder: TDxSortOrder; SortIndex: Integer);
    Procedure SetInternalDisableSort();
    Procedure SetInternalDisableGroup();
    Procedure SetInternalDisableGroupFooter();
    Procedure SetInternalWidth(Width: Integer);
    Procedure SetInternalBand(BandIndex: Integer);
    Procedure SetInternalCellMerging(Value: Boolean);
    Procedure SetInternalContentStyle(Value: TcxGridGetCellStyleEvent);  Virtual;
    Procedure AutoDefineTitle();

    Function DoGetDisplayText(const Id: variant; const Text: String): String; Virtual; Abstract;

    Property  DefaultWidth: Integer read FWidth;
  Public
    Constructor Create(Factory: TGridFactory;
                       View: TCxGridTableView;
                       ExcelInternationalSettings : TClassExcelInternationalSetting;
                       FieldName: String;
                       Title: String); Reintroduce; Virtual;
    Destructor Destroy(); Override;

    Function CanEdit(): boolean; Virtual;
//    Procedure AppendRecord(Dataset: ILocalDataset; dbMapping: TObject); overload; override;
//    Procedure AppendRecord(const controller: TcxCustomDataController; const dbMapping: TObject; const grid: IUnboundGrid); overload; override;
//    Procedure UpdateRecord(Dataset: ILocalDataset); override;

    Procedure ApplyBestFit();
    Procedure BaseSummary(Kind: TCxSummaryKind);
    Function GetIsForExport: Boolean;
    Function GetExcelFormat(Excel: Variant): String; Virtual; Abstract;
    Function GetExcelValue(Ds: TDataSet): Variant; Virtual;
    Function GetValue(Ds: TDataset): String; Overload; Virtual;
    Function GetValue(Value, KeyValue: Variant): String; Overload; Virtual;

//    Function ToString<T: TListItem, constructor>(Entity: T): String; Reintroduce; Overload;
//    Function ToString(Entity: TListItem): String; Reintroduce; Overload;

//    Function GetBindValue(EntityId: Variant): Variant; Virtual;
    Procedure UpdateKeyName(keyFieldName: String);
    Property ColumnAdapterType: TColumnAdapterType read FColumnAdapterType;
    Property KeyFieldName: String read _keyFieldName;
    Property Column: TCxGridColumn  read GetColumn;
    Property SummaryKind: TCxSummaryKind read GetSummaryKind;
    Property FieldName: String read FFieldName;
    Property UpperFieldName: String read FUpperFieldName;
    Property PropertyName: String read FPropertyName;
    Property IsTech: Boolean read FHasTech;
    Property IsHide: Boolean read FHasHide;
    Property IsDisabledGroupFooter: Boolean read FHasDisableGroupFooter;
    Property HasMerging: Boolean read FHasMerging;
    Property HasGrouped: Boolean read FHasGrouped;
    Property HasSortOrder: Boolean read GetHasSortOrder;
    Property GroupIndex: Integer read FGroupIndex;
    Property SortIndex: Integer read FSortIndex;
//    Property IsBinded: Boolean Read FIsBinded;
    Property HasCustomData: Boolean read FHasCustomData;
    Property HasCustomSort: Boolean read FHasCustomSort;
    Property IsData: Boolean read GetIsData;
    Property Title: String read GetCaption;
    Property Caption: String read GetCaption write SetCaption;
    Property HasSummaryDefault: Boolean read _hasSummaryDefaultFunction;
    Property HasSummaryConstructorDefault: Boolean read _hasSummaryConstructorDefault;

    Property ForEditValue: Variant read _forEditValue write _forEditValue;
    Property EditEntity: TListItem read _editEntity write _editEntity;

    Function GetHashCode(): Integer; Override;
    Procedure UnboundMode; Overload; Virtual;

  End;


...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006536
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
поддержка интерфейсов и есть множественное наследование в понятии C++

План Путина нужно читать, а не курить.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006556
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
kealon(Ruslan)
поддержка интерфейсов и есть множественное наследование в понятии C++

План Путина нужно читать, а не курить.
мануалы надо читать "как сделано" ;-)
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006563
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как сделано - вопрос второй. Первый - какие возможности даёт (или не даёт). Интерфейсы не дают возможностей множественного наследования, соответственно, ставить между ними знак равенства - нелепо.
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006568
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

всё оно даёт, правда много чего лишнего делать заставляет, но это уже недостатки конкретной реализации

интерфейс - это и есть классический объект, а если от любого класса можно унаследоваться и выдать ссылку на этот объект - а это возможно, значит всё что связано с множественным наследованием - работает
...
Рейтинг: 0 / 0
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
    #40006573
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
всё оно даёт, правда много чего лишнего делать заставляет

Ну при таком подходе в Fortran IV тоже есть множественное наследование, только с недостатками конкретной реализации.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]