powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как переопределить метод объекта virtual->override
25 сообщений из 38, страница 1 из 2
Как переопределить метод объекта virtual->override
    #39945634
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Имею первоначальный вариант (Delphi 7)

Rx - первоисточник
Код: pascal
1.
2.
3.
4.
5.
  TRxMemoryData = class(TDataSet)
  private
     ......................................
  protected
    function GetActiveRecBuf(var RecBuf: PChar): Boolean; [color=red]virtual;[/color]



Собственный объект
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  TFxIniTable = class(TRxMemoryData)
  private
     ......................................
  protected
    function  GetActiveRecBuf(var RecBuf: PChar): Boolean;[color=red] override;[/color]
     ......................................


function TFxIniTable.GetActiveRecBuf(var RecBuf: PChar): Boolean;
begin
  Result:=inherited GetActiveRecBuf(RecBuf);
  if Result and (FRowRecord>0) then begin
    FRowBuffer:=AllocRecordBuffer;
    Move(Records[FRowRecord-1].Data^,FRowBuffer^,GetRecordSize);
    FRowRecord:=0;
    RecBuf:=FRowBuffer;
  end;
end;


Т.е.
метод-родитель = virtual
метод - дочь = override


Имею переход на Delpho 10.3.3
TFDMemTable - использую как первоисточник-родитель
Он имеет аналогичный метод, но он не есть виртуален !!!!
Соответственно применить описанный выше прием не могу.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  TFxIniTable = class(TFDMemTable)
  private

  protected

    function GetActiveRecBuf(var RecBuf: NativeInt): Boolean; override;  -- здесь ошибка 
    [dcc32 Error] FxIniTable.pas(60): E2170 Cannot override a non-virtual method
    ......................................
    ......................................


function TFxIniTable.GetActiveRecBuf(var RecBuf: PChar): Boolean;
begin
   Result:=inherited GetActiveRecBuf(RecBuf);
   if Result and (FRowRecord>0) then begin
    FRowBuffer:=AllocRecordBuffer;
    Move(Records[FRowRecord-1].Data^,FRowBuffer^,GetRecordSize);
    FRowRecord:=0;
    RecBuf:=FRowBuffer;
  end;
end;


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

Подскажите варианты

Спасибо
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945639
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Overload
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945654
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

нет смысла переживать, RX правят все кому не лень
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945659
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не виртуальны метод нельзя переопределить.
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945666
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

есть подозрение, что виртуализация тут не поможет, NativeInt - явно не указатель на буфер произвольной длины.
Для начала нужно разобраться, как это стало работать.
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945686
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

А reintroduce не поможет?
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945707
vkorshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Class helper ?
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945717
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster
HOME_X,

Overload


Это "дублирования" метода, а как будет выполняться
метод-родитель и метод-дочь ?

override - замена метода, где ссылка на родителя + свой алгоритм

function TFxIniTable.GetActiveRecBuf(var RecBuf: PChar): Boolean;
begin
Result:=inherited GetActiveRecBuf(RecBuf);
+++++ дописываю алгоритм
end


Или я не верно понимаю ?
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945718
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
HOME_X,

нет смысла переживать, RX правят все кому не лень


От Rx отказываюсь
Живу по новому - "переход на Delpho 10.3.3"
Тут править не хочу
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945720
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Не виртуальны метод нельзя переопределить.


Т.е.
переписывать весь класс - вариантов нет ?
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945723
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
HOME_X,

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


Тип привлек внимание - но первично хотел решить вопрос переопределение метода

В исходниках нашел только один объект с такой сигнатуров, по сути обработки
функционал очень похож на исходники RX соответственно не акцентировал внимания
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945727
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual Student
HOME_X,

А reintroduce не поможет?


Компилятор и сборщик отработал нормально
А как относительно вызовов метода ?

Отработает стандартная переадресация и можно стандартно
решить свои "душные" вопросики

Так будет работать ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function TFxIniTable.GetActiveRecBuf(var RecBuf: PChar): Boolean;
begin
  Result:=inherited GetActiveRecBuf(RecBuf);
  if Result and (FRowRecord>0) then begin
    FRowBuffer:=AllocRecordBuffer;
    Move(Records[FRowRecord-1].Data^,FRowBuffer^,GetRecordSize);
    FRowRecord:=0;
    RecBuf:=FRowBuffer;
  end;
end;



Спасибо
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945742
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X

Так будет работать ?

Будет, если вы вызываете этот метод самостоятельно. Родитель его вызывать не будет
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945763
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

Дык, если бы ему нужно было вызвать только самостоятельно, то это мог бы быть просто другой новый метод, с другим названием.))
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945781
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. А, вообще, это напоминает, как медведь в теремок лез.))
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945837
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual Student
HOME_X,

А reintroduce не поможет?


Вроде получилось как Вы рекомендовали
Спасибо

Код: 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.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TMyParent = class(TObject)
    iNum: Integer;
    Procedure MyExecute(L: Integer);
    Function  MyView: Integer;
  private
    { Private declarations }
  protected

  public
    { Public declarations }
  end;

type
  TMyChild = class(TMyParent)
    iChild: Integer;
    Procedure MyExecute(L: Integer); reintroduce;
    Function  MyView: Integer; reintroduce; //override;
  private
    { Private declarations }
  protected

  public
    { Public declarations }
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    O: TMyParent;
    C: TMyChild;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyParent.MyExecute(L: Integer);
begin
  ShowMessage('MyObject');
  iNum:=L;
end;

function TMyParent.MyView: Integer;
begin
  Result:=iNum;
end;

procedure TMyChild.MyExecute(L: Integer);
begin
  inherited MyExecute(L);
  ShowMessage('MyChild');
  iChild:=L+L+L;
end;

function TMyChild.MyView: Integer;
begin
  Result:=inherited MyView;
  ShowMessage(IntToStr(iChild)+' '+IntToStr(Result));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  O:=TMyParent.Create;
  O.MyExecute(12);
  ShowMessage(IntToStr(O.MyView));
  C:=TMyChild.Create;
  C.MyExecute(24);
  ShowMessage(IntToStr(C.MyView));
end;

end.

...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945839
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F
P.S. А, вообще, это напоминает, как медведь в теремок лез.))


Сравнение не понял !

Вроде Virtual Student дал верный совет
Сейчас еще додумаю ...

Спасибо
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945845
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз в RX GetActiveRecBuf объявлен как виртуальный, значит его именно в RX и вызывают в тех методах, которые переопределены у TDataset. Смотрим, где он фигурирует и главное для чего, и реализуем у себя подобное.
На данный момент содержание топика следующее
У меня был один компонент TForm, там был виртуальный метод SetBounds.
Теперь у меня совершенно другой компонент TDataset.
Как мне переопределить TDataset.SetBounds, если его там нет ?
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945861
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
reintroduce - это новый одноименный метод скрывающий такой же в родителе
Код: 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.
type
TBase = class(TObject)
   function Test: string; virtual;
end;

TChild1 = class(TBase)
  function Test: string;override;
end;

TChild2 = class(TBase)
  function Test: string;reintroduce;
end;

{ TBase }

function TBase.Test: string;
begin
  Result := 'TBase.Test';
end;

{ TChild1 }

function TChild1.Test: string;
begin
  Result := inherited Test + #13 + 'TChild1.Test';
end;

{ TChild2 }

function TChild2.Test: string;
begin
  Result := inherited Test + #13 + 'TChild2.Test';
end;

procedure TForm1.Button1Click(Sender: TObject);
var A: TBase;
begin
  Memo1.Lines.Add(TChild1.Create.Test);
  Memo1.Lines.Add(TChild2.Create.Test);
  Memo1.Lines.Add('------');
  A := TChild1.Create;
  Memo1.Lines.Add(A.Test);
  A := TChild2.Create;
  Memo1.Lines.Add(A.Test);
end;

...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945895
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X

Вроде получилось как Вы рекомендовали
Код: 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.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TMyParent = class(TObject)
    iNum: Integer;
    Procedure MyExecute(L: Integer);
    Function  MyView: Integer;
  private
    { Private declarations }
  protected

  public
    { Public declarations }
  end;

type
  TMyChild = class(TMyParent)
    iChild: Integer;
    Procedure MyExecute(L: Integer); reintroduce;
    Function  MyView: Integer; reintroduce; //override;
  private
    { Private declarations }
  protected

  public
    { Public declarations }
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    O: TMyParent;
    C: TMyChild;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyParent.MyExecute(L: Integer);
begin
  ShowMessage('MyObject');
  iNum:=L;
end;

function TMyParent.MyView: Integer;
begin
  Result:=iNum;
end;

procedure TMyChild.MyExecute(L: Integer);
begin
  inherited MyExecute(L);
  ShowMessage('MyChild');
  iChild:=L+L+L;
end;

function TMyChild.MyView: Integer;
begin
  Result:=inherited MyView;
  ShowMessage(IntToStr(iChild)+' '+IntToStr(Result));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  O:=TMyParent.Create;
  O.MyExecute(12);
  ShowMessage(IntToStr(O.MyView));
  C:=TMyChild.Create;
  C.MyExecute(24);
  ShowMessage(IntToStr(C.MyView));
end;

end.


Ваш пример ломается простым
Код: pascal
1.
2.
O: TMyParent; 
C: TMyParent; // TMyChild;
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945903
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr

Ваш пример ломается простым


Мой пример АБСОЛЮТНО неверен - так как
переназначение указателя на процедуру не происходит
Вот верный тест

Результат должен быть сначала
ShowMessage('Update Child');
ShowMessage('Update Parent');
Чего не происходит....!!!!

Код: 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.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TMyParent = class(TObject)
    iSave: Integer;
    Procedure MySave(I: Integer);
    Function  MyView: Integer;
  private
    { Private declarations }
  protected
    Procedure MyUpdate(I: Integer); //virtual;
  public
    { Public declarations }
  end;

type
  TMyChild = class(TMyParent)
  private
    { Private declarations }
  protected
    Procedure MyUpdate(I: Integer); reintroduce; //override;
  public
    { Public declarations }
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    O: TMyParent;
    C: TMyChild;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyParent.MySave(I: Integer);
begin
  MyUpdate(I);
end;

function TMyParent.MyView: Integer;
begin
  Result:=iSave;
end;

procedure TMyParent.MyUpdate(I: Integer);
begin
  ShowMessage('Update Parent');
  iSave:=I;
end;

procedure TMyChild.MyUpdate(I: Integer);
begin
  ShowMessage('Update Child');
  inherited MyUpdate(I);
  ShowMessage(IntToStr(inherited MyView+5));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  C:=TMyChild.Create;
  C.MySave(10);
  ShowMessage(IntToStr(C.MyView));
end;

end.
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945929
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

А зачем вам собственный класс? Вы переходите абсолютно на другой класс, где гарантия что там та же логика?
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39945947
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Vlad F
P.S. А, вообще, это напоминает, как медведь в теремок лез.))

Сравнение не понял !

Чего непонятного, - там тоже с самого начала было очевидно, что не залезает.
Вроде Virtual Student дал верный совет

Ну, дык, студент он и есть студент.)
Сейчас еще додумаю.
Давай-давай, - наблюдаем с интересом.))
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39946083
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X

Мой пример АБСОЛЮТНО неверен - так как
переназначение указателя на процедуру не происходит
Вот верный тест


И этот пример точно так же неверен.
Он даже не компилится
...
Рейтинг: 0 / 0
Как переопределить метод объекта virtual->override
    #39946090
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr

Он даже не компилится


Почему ?
Сборка идет нормально и компиляция тоже (могу прислать exe-к)
Переопределения метода MyUpdate объекта C реально нет
Т.е. цель не достигнута

Может есть еще предложения - как то не хочется класс переписывать...
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как переопределить метод объекта virtual->override
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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