Форум: "Прочее";
Текущий архив: 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.083 c