169 похожих чатов

Type IObjectExt = interface(IObject) end;

IArrayExt = interface(IArray)
function GegObject(const AIndex: Integer): ISuperObjectExt;
end;

function TArrayExt.GetObject(const AIndex: Integer): IObjectExt;
var
Obj: IObject;
begin
Obj := Self.GetObj[AIndex]; // метод из IArray
Result := Obj as IObjectExt; // так не работает
end;

Дальше с интерфейсами разбираюсь, как в этом случае вернуть нужный мне интерфейс, точнее привести к нужному типу?
Result := Obj as IObjectExt;

52 ответов

123 просмотра

Поставь GUID у интерфейсов или Result := IObjectExt(Obj)

Alex-Egorov Автор вопроса
Alex Egorov
Это стоит, тут для краткости

Тогда реализацию в студию

Alex-Egorov Автор вопроса
Alex Egorov
Так сработало - Result := IObjectExt(Obj)

Так делать не стОит - последующие изменения в реализации могут добавить граблей надежней всего Supports() - покрывает большую долю различных реализаций

Не пойму в чём фишка интерфейсов? Отлаживать сложно, непонятно как будут себя вести в мультипотоке(счётчик ссылок то один), ну и в VCL не наблюдал обилие интерфейсов. Есть ли примивный пример, где все скажут что ДА тут интерфейсы как нигде в тему?

Александр Смоляков
Не пойму в чём фишка интерфейсов? Отлаживать сложн...

целая куча статей в интернете зачем нужны интерфейсы, проще их почитать чем всю инфу сюда опять вываливать

Александр Смоляков
Не пойму в чём фишка интерфейсов? Отлаживать сложн...

Странный вопрос. Вы предлагаете на пальцах быстро пояснить инструмент, предназначенный для того, чтоб сложные приложения сделать надежнее?

Alex-Egorov Автор вопроса
Сергей
Так делать не стОит - последующие изменения в реал...

Supports - это если GIUD установлен и есть реализация в классе. А приведение вполне возможно, т. к. у него есть наследование интерфейсов, но при рефакторинге могут возникнуть проблемы. Ну и приведение работает значительно быстрее.

Александр Смоляков
Не пойму в чём фишка интерфейсов? Отлаживать сложн...

1. Уникальный менеджер памяти 2. Автоуничтожение 3. Счетчик ссылок потокбезопасен 4. Есть weak - очистка слабых ссылок 5. Удобно делать реализацию, если код написан на другом языке, поддержиющих интерфейсы 6. Множественное наследование 7. Можно реализовать несколько реализаций одного и того же интерфейса И многое другое.

Alexander 👋
1. Уникальный менеджер памяти 2. Автоуничтожение 3...

Почему такой прекрасный инструмент слабо используется и в VCL и в LCL? Вот ООП там сплошь и рядом.

Александр Смоляков
Почему такой прекрасный инструмент слабо используе...

В FMX - прямо многое реализовано на интерфейсах. Но интерфейсы нужно применять для своих задач.

Александр Смоляков
Почему такой прекрасный инструмент слабо используе...

Потому что нет смысла использовать бинокль, когда хочешь почитать книжку, есть более простые инструменты

Александр Смоляков
Почему такой прекрасный инструмент слабо используе...

Ещё одно применение - использовать интерфейсы можно между разными программами и языками

Hemul GM
Потому что нет смысла использовать бинокль, когда ...

Как понять когда нужен бинокль, а когда очки?

Александр Смоляков
Почему такой прекрасный инструмент слабо используе...

Потому что его нужно применять только там где он необходим. В VCL в нем необходимости нет, у себя же в софте мы используем интерфейсы практически повсеместно в бизнеслогике.

Александр Смоляков
Как понять когда нужен бинокль, а когда очки?

когда/если возникнут задачи, где полезны интерфейсы, ты сам поймешь что они нужны если не юзал - значит не было задач под них. а тянуть их в код лишь бы были, не стоит

Handatros
когда/если возникнут задачи, где полезны интерфейс...

Можно тупо на процедурах и функциях реализовать ВСЁ вместо ООП и не понять что ООП там лучше подходит

Александр Смоляков
Как понять когда нужен бинокль, а когда очки?

Например, когда в разных классах нужен определенный одинаковый набор методов, но сделать так, чтоб они были все от одного предка нельзя

Hemul GM
Например, когда в разных классах нужен определенны...

вот это очень полезно. на ооп сделать можно, но будет винегрет из кода

Александр Смоляков
Можно тупо на процедурах и функциях реализовать ВС...

ООП позволяет лучше организовать код в большом проекте. Что позволяет его проще масштабировать в будущем

Hemul GM
ООП позволяет лучше организовать код в большом про...

процедуры тоже позволяют переиспользовать код

Александр Смоляков
процедуры тоже позволяют переиспользовать код

Это никак не помогает в организации кода, это помогает лишь в его сокращении

Александр Смоляков
Можно тупо на процедурах и функциях реализовать ВС...

Функциональщина без интерфейсов - в паскале, это жесть не работающая

Alexander 👋
Функциональщина без интерфейсов - в паскале, это ж...

Смотря что за проект, не вездуе нужно интерфейсы тянуть. например у меня в РММ они вообще не используются ибо не нужны

Александр (Rouse_) Багель
Смотря что за проект, не вездуе нужно интерфейсы т...

У тебя там реализация на ООП Но я про другое. При функциональщине по идее нужны для работы всякие структуры данных, типа списков и т. д. Вот это все удобно реализовать на интерфейсах, чтобы удобно было пользоваться.

Alexander 👋
У тебя там реализация на ООП Но я про другое. При ...

первый раз слышу чтобы типы данных реализовывали на интерфейсах. У нас интерфейсы применяются для имплементации конкретной части бизнеслогики, зачастую вынесеную совсем далеко

Alexander 👋
Удобно: авторазрушение и все такое.

После того как ввели инлайнвары с скоповой обвязкой - все это стало шататься

Hemul GM
Ничего не стало. Все там нормально 😁

Если ты не видишь проблемы - это не значит что её нет

Александр (Rouse_) Багель
Если ты не видишь проблемы - это не значит что её ...

Если ты не используешь инлайн вары, то и волновать тебя не должны скопы

Александр (Rouse_) Багель
После того как ввели инлайнвары с скоповой обвязко...

Это только в новых версиях и надо их очень хорошо понимать. Я пока на токио сижу. Но и там тоже можно автоудаление реализовать другими способами. А тема изначально была про функциональщину. К ней нужны структуры для хранения данных, их проще реализовать с нужными фичами через интерфейсы. Так мне кажется.

Hemul GM
Если ты не используешь инлайн вары, то и волновать...

я не использую, коллеги пытаются, но вот этот код, ранее работавший совершенно нормально, теперь посыпался и его использовать нельзя https://alexander-bagel.blogspot.com/2014/11/store.html

Hemul GM
А какой именно?

шаредптры который

Александр (Rouse_) Багель
первый раз слышу чтобы типы данных реализовывали н...

разделение кода - это самая полезная часть интерфейсов

Александр (Rouse_) Багель
я не использую, коллеги пытаются, но вот этот код,...

Статья хорошая. Но начиная с TestWriteBySharedPtr так делать не рекомендует Microsoft, т. к. закрытие handles должно происходить в ручном режиме и для этого необходимо использовать IDisposable Типа что-то такого https://learn.microsoft.com/ru-ru/dotnet/api/system.idisposable?view=net-8.0

Alexander 👋
Статья хорошая. Но начиная с TestWriteBySharedPtr ...

Да ей 100 лет в обед, третья часть статьи устарела давно и осталась просто для истории :)

Alex-Egorov Автор вопроса
Alexander 👋
Supports - это если GIUD установлен и есть реализа...

В общем приведение типов работает, но приведённый интерфейс не знает методов интерфейса *Ext (а при попытке использования Supports - я не получаю интерфейс, что ожидаемо, т.к. дочерний интерфейс не реализует медотов родителя). И в этом случае методы интерфейса *Ext не работают, а это единственное, для чего я это создавал, когда спросил, как написать хелперы для интерфейса. Обходной манёвр сделал - выдирание всех данных из дочернего и создание нового родительского. Это это как-то перебор, хотя и работает

Alex-Egorov Автор вопроса

Возможно и заблудился, не спорю, вот пример: type IMyInt = interface ['{85FEDDA8-4248-4B21-8FB5-0D5A29C67AF1}'] function GetStr: string; end; TMyInt = class(TInterfacedObject, IMyInt) function GetStr: string; end; IMyInt2 = interface ['{0E925C39-27B7-4D70-9A38-720D1D22DEBD}'] function GetObj: IMyInt; end; TMyInt2 = class(TInterfacedObject, IMyInt2) function GetObj: IMyInt; end; { TMyInt } function TMyInt.GetStr: string; begin Result := 'True'; end; { TMyInt2 } function TMyInt2.GetObj: IMyInt; begin Result := TMyInt.Create; end; type IMyIntExt = interface(IMyInt) ['{B28EFFE4-36A0-43A1-87D5-C4ADB0EFA059}'] function GS: string; end; TMyIntExt = class(TMyInt, IMyIntExt) function GS: string; end; IMyIntExt2 = interface(IMyInt2) ['{62FBE49D-ED7B-4EB6-BC2B-9B7DBFD01895}'] function GO: IMyIntExt; end; TMyIntExt2 = class(TMyInt2, IMyIntExt2) function GO: IMyIntExt; end; { TMyIntExt } function TMyIntExt.GS: string; begin Result := Self.GetStr; end; { TMyIntExt2 } function TMyIntExt2.GO: IMyIntExt; begin Result := IMyIntExt(Self.GetObj); end; function MI: IMyInt2; begin Result := TMyInt2.Create; end; function MIExt: IMyIntExt2; begin Result := TMyIntExt2.Create; end; var SS := MI.GetObj.GetStr; var SS2 := MIExt.GO.GS; Результат: SS='True', SS2 дома эксепшн получаю Всё, что мне нужно, это чтобы SS2 получилось заполнить используя хелперы GO и GS

Alex Egorov
Возможно и заблудился, не спорю, вот пример: type...

чатик мне посоветовал так поменять: type IMyInt = interface ['{85FEDDA8-4248-4B21-8FB5-0D5A29C67AF1}'] function GetStr: string; end; TMyInt = class(TInterfacedObject, IMyInt) function GetStr: string; end; IMyIntExt = interface(IMyInt) ['{B28EFFE4-36A0-43A1-87D5-C4ADB0EFA059}'] function GS: string; end; TMyIntExt = class(TMyInt, IMyIntExt) function GS: string; end; IMyInt2 = interface ['{0E925C39-27B7-4D70-9A38-720D1D22DEBD}'] function GetObj: IMyIntExt; end; TMyInt2 = class(TInterfacedObject, IMyInt2) function GetObj: IMyIntExt; end; IMyIntExt2 = interface(IMyInt2) ['{62FBE49D-ED7B-4EB6-BC2B-9B7DBFD01895}'] function GO: IMyIntExt; end; TMyIntExt2 = class(TMyInt2, IMyIntExt2) function GO: IMyIntExt; end; implementation { TMyInt } function TMyInt.GetStr: string; begin Result := 'True'; end; { TMyInt2 } function TMyInt2.GetObj: IMyIntExt; begin Result := TMyIntExt.Create; end; { TMyIntExt } function TMyIntExt.GS: string; begin Result := Self.GetStr; end; { TMyIntExt2 } function TMyIntExt2.GO: IMyIntExt; begin Result := Self.GetObj; end; function MI: IMyInt2; begin Result := TMyInt2.Create; end; function MIExt: IMyIntExt2; begin Result := TMyIntExt2.Create; end; procedure TForm15.Button1Click(Sender: TObject); begin var SS := MI.GetObj.GetStr; var SS2 := MIExt.GO.GS; end;

Alex-Egorov Автор вопроса
Handatros
чатик мне посоветовал так поменять: type IMyInt ...

Ну так и я смог бы, но всё, что не *Ext - это не моё, трогать нельзя

Alex-Egorov Автор вопроса
Handatros
ну пока что есть

ГПТ мне посоветовало хелпер для интерфейса написать, а Delphi его не приняла, почитал - он не реализован

Alex Egorov
Возможно и заблудился, не спорю, вот пример: type...

TMyIntExt2.GO должен возвратить новый объект: Result := TMyIntExt.Create

Alex-Egorov Автор вопроса
Green
TMyIntExt2.GO должен возвратить новый объект: Resu...

Там на самом деле данные заполняются и парсятся при вызове первоначальной функции MIExt. Но сейчас я так и делаю, вызываю в TMyInt2.GO дочерний метод TMyInt.GetObj, получаю из него данные, заново загоняю их на парсинг уже в TMyIntExt.Create. Но это получается двойная работа и потеря производительности

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

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта