Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.063 c
15-1347866015
brother
2012-09-17 11:13
2013.03.22
Анимация в Excel


2-1332430983
теркин
2012-03-22 19:43
2013.03.22
Представление двухмерного массива в виде динамического списка


15-1340637706
Барлог_
2012-06-25 19:21
2013.03.22
щебенка в колодец. как отфильтровать?


15-1352992480
Dennis I. Komarov
2012-11-15 19:14
2013.03.22
DNS


15-1333823439
antonn
2012-04-07 22:30
2013.03.22
Сколько стоит такой специалист





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский