Вниз
Скачать: CL | DM;

Торможу.. с перекрытием в наследнике функции   Найти похожие ветки 

← →
AV ©   (2012-07-25 15:13) [0]

если так

type
 TO1 = class
   public
     B:Boolean;
     procedure func; virtual;
 end;
 TO2 = class(TO1)
   public
     procedure func; override;
 end;

var
 o2: TO2;

procedure TO1.func;
begin
 if B then
   form1.mmo1.Lines.Add("TO1.func: " + BoolToStr(B));
end;

procedure TO2.func;
begin
 B := Random(2) = 0;
 form1.mmo1.Lines.Add("TO2.func: " + BoolToStr(b));
 inherited;
end;

 o2 := to2.Create;
 o2.func;


то все нормально. Если переделать на функции.
 TO1 = class
   public
     function func:boolean; virtual;
 end;
 TO2 = class(TO1)
   public
     function func:boolean; override;
 end;

function TO1.func: boolean;
begin
 if Result then
   form1.mmo1.Lines.Add("AFTER");
end;

function TO2.func: boolean;
begin
 Result := Random(2) = 0;
 form1.mmo1.Lines.Add("TO2.func: " + BoolToStr(Result));
 inherited; // [Error] Unit1.pas(58): Incompatible types
end;


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


← →
Компромисс ©   (2012-07-25 15:20) [1]

inherited


← →
Компромисс ©   (2012-07-25 15:20) [2]

Oops, торможу )


← →
Компромисс ©   (2012-07-25 15:21) [3]

inherited func


← →
Омлет ©   (2012-07-25 15:24) [4]

Не надейся, Result из потомка в метод предка не попадет.


← →
AV ©   (2012-07-25 15:46) [5]


> Компромисс ©   (25.07.12 15:21) [3]
> inherited func

Спасибо!


← →
картман ©   (2012-07-25 16:10) [6]


>  inherited; // [Error] Unit1.pas(58): Incompatible types

не получается еррор:(


← →
AV ©   (2012-07-25 16:54) [7]


> не получается еррор:(

Delphi7

type
 TO1 = class
   public
     function func:boolean; virtual;
 end;
 TO2 = class(TO1)
   public
     function func:boolean; override;
 end;

 TForm1 = class(TForm)
   mmo1: TMemo;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private     { Private declarations }
 public      { Public declarations }
   o2: TO2;
 end;

var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 o2 := to2.Create;
 o2.func;
end;

function TO1.func: boolean;
begin
 if Result then
   form1.mmo1.Lines.Add("AFTER");
end;

function TO2.func: boolean;
begin
 Result := Random(2) = 0;
 form1.mmo1.Lines.Add("TO2.func: " + BoolToStr(Result));
 inherited;
end;
end.


← →
картман ©   (2012-07-25 17:04) [8]


>
> Delphi7

xe стал быть поумнел


← →
Игорь Шевченко ©   (2012-07-25 17:05) [9]


> function TO1.func: boolean;
> begin
>  if Result then
>    form1.mmo1.Lines.Add("AFTER");
> end;
>
> function TO2.func: boolean;
> begin
>  Result := Random(2) = 0;
>  form1.mmo1.Lines.Add("TO2.func: " + BoolToStr(Result));
>
>  inherited;
> end;


Феерично


← →
AV ©   (2012-07-25 17:07) [10]

краткость сестр


← →
Компромисс ©   (2012-07-25 17:11) [11]

AV ©   (25.07.12 17:07) [10]

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


← →
Компромисс ©   (2012-07-25 17:12) [12]

function TO1.func: boolean;
var flag: boolean;
begin
 if flag then
   form1.mmo1.Lines.Add("AFTER");
end;

function TO2.func: boolean;
var flag: boolean;
begin
 flag := Random(2) = 0;
 form1.mmo1.Lines.Add("TO2.func: " + BoolToStr(Result));
 inherited;
end;


← →
Игорь Шевченко ©   (2012-07-25 18:32) [13]

Компромисс ©   (25.07.12 17:12) [12]


> function TO1.func: boolean;
> var flag: boolean;
> begin
>  if flag then
>    form1.mmo1.Lines.Add("AFTER");
> end;


Эхо ?


← →
Компромисс ©   (2012-07-25 18:34) [14]


> Эхо ?


Это код автора ветки, я всего лишь заменил Result на локальную переменную flag, чтобы ему стала понятна Ваша "фееричность".


← →
AV ©   (2012-07-25 18:35) [15]


> Result - это локальная переменная, а не член класса, поэтому
> в потомке она не будет та же, что в предке, и наоборот.

это понятно
вроде бы

тогда почему

> inherited func


работает?


← →
RWolf ©   (2012-07-25 18:51) [16]


> тогда почему inherited func работает?

потому что результат её вызова возвращается в регистре EAX и до самого возарата из метода ничем не затирается.


← →
AV ©   (2012-07-25 20:07) [17]

т.е. я могу юзать этот способ совершенно легально?

тут в чем дело - есть модуль. Неизвестно кем писался, исходников нет.
Есть класс, есть функция, которая работает иногда неправильно.
Мне кажется, что в начале этой функции переменную резалт тупо не инициализировали.
И, бывает, что она идет по пути, где ей не присваивается значение и возвращается мусор

Если я оберну таким образом - не словлю потом что-нибудь?


← →
Sha ©   (2012-07-25 20:37) [18]


> Мне кажется, что в начале этой функции переменную резалт
> тупо не инициализировали.

Что мешает проверить?


> Если я оберну таким образом - не словлю потом что-нибудь?

Запросто.
Результат может вычисляться/храниться где угодно, а потом перемещаться в eax.


← →
AV ©   (2012-07-25 20:40) [19]


> Что мешает проверить?

да я проверил - пока, работает


← →
Игорь Шевченко ©   (2012-07-25 21:29) [20]


> тут в чем дело - есть модуль. Неизвестно кем писался, исходников
> нет.
> Есть класс, есть функция, которая работает иногда неправильно.
>


Shift+Del


← →
Inovet ©   (2012-07-26 06:57) [21]

> [19] AV ©   (25.07.12 20:40)
> > Что мешает проверить?
>
> да я проверил - пока, работает

Проверить инициалицацию в окне CPU, видимо имелось ввиду.


← →
Cobalt ©   (2012-07-29 10:30) [22]

> AV ©   (25.07.12 20:07) [17]
> т.е. я могу юзать этот способ совершенно легально?

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.049 c
15-1347564415
Guest
2012-09-13 23:26
2013.03.22
Где можно узнать количество АЛУ и физических регистров процессора


15-1342693823
.dmitry
2012-07-19 14:30
2013.03.22
Произошел сбой программе инициализации библиотеки динамической ко


2-1345929626
Wadimka
2012-08-26 01:20
2013.03.22
Подскажите компонент для delphi для работы с SSH


2-1346412530
теркин
2012-08-31 15:28
2013.03.22
Чтение запись TObjectList в файл


2-1342205003
vasa777
2012-07-13 22:43
2013.03.22
сплойт




   Наверх