Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: 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 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.052 c
15-1349555402
Юрий
2012-10-07 00:30
2013.03.22
С днем рождения ! 7 октября 2012 воскресенье


15-1343759274
Rouse_
2012-07-31 22:27
2013.03.22
Кто сидит на корбине, нид хелп небольшой


15-1337757619
alexdn
2012-05-23 11:20
2013.03.22
Php


15-1333798232
ProgRAMmer Dimonych
2012-04-07 15:30
2013.03.22
Шаблон консольного приложения Delphi 7


2-1348217897
noob_one
2012-09-21 12:58
2013.03.22
Помогите сконвертировать строку