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

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

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

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

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

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

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

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

Строго как на картинке.
"Наследник_XYZ" содержит(собирается) из "Родителя" и "Дополнений" X, Y, Z. Все остальные "Дополнения" не должны попасть в "Наследник".
...
Рейтинг: 0 / 0
06.10.2020, 14:03
    #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
06.10.2020, 14:38
    #40005739
Maxim.K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
_Vasilisk_
Тогда делаем все на интерфейсах.

Большое спасибо.
Очень полезная информация. Но подозреваю, что Вы привели решение более "сложной" задачи, чем я пытаюсь решить(моя вина, что плохо объяснил).
Не требуется собирать Объект в рантайме, нужно всего лишь на этапе программирования так объявить(составить) Класс-Наследник, чтоб в рантайме он уже был готов к работе(без дополнительной сборки).
...
Рейтинг: 0 / 0
06.10.2020, 15:06
    #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
06.10.2020, 15:14
    #40005766
Maxim.K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
softwarer

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

Большое Спасибо.
...
Рейтинг: 0 / 0
07.10.2020, 14:29
    #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
07.10.2020, 14:52
    #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
07.10.2020, 15:01
    #40006195
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
Uridian
Этот способ противоречит условию задачи

Неверно.

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

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

Неверно.


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

Неверно.


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

а зачем?
обычная практика просто вынести свойство с "нужным дополнением" и напрямую указывать его вызовы
н-р, Form.Canvas.{...}
...
Рейтинг: 0 / 0
08.10.2020, 10:43
    #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
08.10.2020, 12:11
    #40006536
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
kealon(Ruslan)
поддержка интерфейсов и есть множественное наследование в понятии C++

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

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

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

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

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


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