Size: a a a

2020 March 12

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
встречный вопрос - а почему ты так стараешься избежать виртуального метода?
виртуальные вызовы дорогие
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
виртуальные вызовы дорогие
а какую вообще ты преследуешь конечную цель? может быть есть еще решения?
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
а какую вообще ты преследуешь конечную цель? может быть есть еще решения?
цель - вытащить из обработчика поставщик данных. чтоб обработчик мог не только с буфером работать, но и, например, со стримом. только и всего
источник

GB

George Bakhtadze in Delphi & Lazarus
женерики для такого подходят идеально, если не охота связываться с динамическим связыванием
источник

GB

George Bakhtadze in Delphi & Lazarus
по сути параметризация кодом. через тип. широкий класс задач. компараторы те же. да обсуждали ведь вчера все это? :)
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
суть в том, чтобы TTest1 сделать интерфейсом. тогда вызывается нужный метод. и как говорил ты, да и тот же Стефан должно вызываться как невиртуальный метод. но пока что я вижу нечто похожее на виртуальный вызов. хотя сам метод без virtual
type
 ITest = interface
   procedure Test();
 end;

 TTest1 = class(TInterfacedObject, ITest)
   procedure Test();
 end;

 TTest2 = class(TTest1, ITest)
   procedure Test();
 end;

 TTest<T: TTest1, constructor> = class(TObject)
   FTest: ITest;
   procedure TestIt();
 end;

procedure TTest1.Test();
begin
 WriteLn('1');
end;

procedure TTest2.Test();
begin
 WriteLn('2');
end;

procedure TTest<T>.TestIt();
begin
 FTest := T.Create;
 FTest.Test();
 readln;
end;

begin
 with TTest<TTest2>.Create do
   TestIt();
end.


так?
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
type
 ITest = interface
   procedure Test();
 end;

 TTest1 = class(TInterfacedObject, ITest)
   procedure Test();
 end;

 TTest2 = class(TTest1, ITest)
   procedure Test();
 end;

 TTest<T: TTest1, constructor> = class(TObject)
   FTest: ITest;
   procedure TestIt();
 end;

procedure TTest1.Test();
begin
 WriteLn('1');
end;

procedure TTest2.Test();
begin
 WriteLn('2');
end;

procedure TTest<T>.TestIt();
begin
 FTest := T.Create;
 FTest.Test();
 readln;
end;

begin
 with TTest<TTest2>.Create do
   TestIt();
end.


так?
да, только FTest: T;
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
да, только FTest: T;
ммм, а куда тогда интерфейсы тут прикрутить?
в коде выше именно FTest - интерфейс, а тип указывает класс, который его реализует
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
ммм, а куда тогда интерфейсы тут прикрутить?
в коде выше именно FTest - интерфейс, а тип указывает класс, который его реализует
FTest: T, а T ограничен интерфейсом ITest, в коих переименован TTest1. иерархия более одного уровня не нужна
источник

GB

George Bakhtadze in Delphi & Lazarus
в принципе, женерики в таком случае не нужны. можно действительно как ITest объявить. с другой стороны, итерфейсная ссылка не нужна, а она по идее не будет таковой с женериками
источник
2020 March 13

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
FTest: T, а T ограничен интерфейсом ITest, в коих переименован TTest1. иерархия более одного уровня не нужна
а, нудык это же получается обычный delphi way. я думал, что ты хочешь чего-то нестандартного.
единственное, что ты должен будет на вход классу подавать уже готовый инстанс (интерфейсную ссылку на инстанс)
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
а, нудык это же получается обычный delphi way. я думал, что ты хочешь чего-то нестандартного.
единственное, что ты должен будет на вход классу подавать уже готовый инстанс (интерфейсную ссылку на инстанс)
да не хочу я нестандартного. хочу стандартного, без лишнего оверхеда на ровном месте. про интерфейсную ссылку не понял. она мне не нужна
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
да не хочу я нестандартного. хочу стандартного, без лишнего оверхеда на ровном месте. про интерфейсную ссылку не понял. она мне не нужна
type
 ITest = interface
   procedure Test();
 end;

 TTest1 = class(TInterfacedObject, ITest)
   procedure Test();
 end;

 TTest2 = class(TTest1, ITest)
   procedure Test();
 end;

 TTest<T: ITest> = class(TObject)
   FTest: T;
   constructor Create(ATest: T);
   procedure TestIt();
 end;

procedure TTest1.Test();
begin
 WriteLn('1');
end;

procedure TTest2.Test();
begin
 WriteLn('2');
end;

constructor TTest<T>.Create(ATest: T);
begin
 FTest := ATest;
end;

procedure TTest<T>.TestIt();
begin
 FTest.Test();
 readln;
end;

begin
 with TTest<ITest>.Create(TTest2.Create) do
   TestIt();
end.


ты просто это говорил да, только FTest: T;?
в таком случае реально женерики тут не особо к месту
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
type
 ITest = interface
   procedure Test();
 end;

 TTest1 = class(TInterfacedObject, ITest)
   procedure Test();
 end;

 TTest2 = class(TTest1, ITest)
   procedure Test();
 end;

 TTest<T: ITest> = class(TObject)
   FTest: T;
   constructor Create(ATest: T);
   procedure TestIt();
 end;

procedure TTest1.Test();
begin
 WriteLn('1');
end;

procedure TTest2.Test();
begin
 WriteLn('2');
end;

constructor TTest<T>.Create(ATest: T);
begin
 FTest := ATest;
end;

procedure TTest<T>.TestIt();
begin
 FTest.Test();
 readln;
end;

begin
 with TTest<ITest>.Create(TTest2.Create) do
   TestIt();
end.


ты просто это говорил да, только FTest: T;?
в таком случае реально женерики тут не особо к месту
а я о чем? женерики что есть, что их нет. один фиг виртуальный вызов.
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
а я о чем? женерики что есть, что их нет. один фиг виртуальный вызов.
да не, все ок с ними 🙂
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
да не, все ок с ними 🙂
если использовать как тайпкастозаменитель, то да
источник

GB

George Bakhtadze in Delphi & Lazarus
новости с фронтов - как говорил Стефан, если сделать методы виртуальными, но TTest2 объявить sealed (или метод final), то вызов не виртуальный. рандомщина какая-то
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
новости с фронтов - как говорил Стефан, если сделать методы виртуальными, но TTest2 объявить sealed (или метод final), то вызов не виртуальный. рандомщина какая-то
ну отлично, значит есть решение
источник

GB

George Bakhtadze in Delphi & Lazarus
Viktor Akselrod
ну отлично, значит есть решение
классное решение. чтоб вызов метода был невиртуальным, надо объявить его виртуальным (иначе не тот вызовется). а если не объявить виртуальным, но использовать интерфейс в качестве ограничения типа, то вызов будет виртуальным.
источник

VA

Viktor Akselrod in Delphi & Lazarus
George Bakhtadze
классное решение. чтоб вызов метода был невиртуальным, надо объявить его виртуальным (иначе не тот вызовется). а если не объявить виртуальным, но использовать интерфейс в качестве ограничения типа, то вызов будет виртуальным.
тебе не угодить 🙂
источник