![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как удалить метод в наследнике ?
Juice © (2005-07-25 14:31:00)Класс А содержит паблик-метод М, класс Б наследуется от А. Вопрос: как сделать так, чтобы класс Б не содержал метода М ?
Begin (2005-07-27 13:31:00) [1]overload- это когда ты в рамках одного класса (или модуля) хочешь иметь два одноименных метода, но с разным функционалом.
function strN(X : integer) : ShortString; overload;
function strN(X : extended) : ShortString; overload;
Какой именно метод вызывается, компилятор определит по набору параметров. Это действо, IMHO, более корректно называть переопределение
virtual - override- это когда метод наследника как то изменяет метод родителя. Оть это - перекрытие...
XParent = class
function XMethod(X1, X2 : integer) : integer; virtual;
end;
XChild = class(XParent)
function XMethod(X1, X2 : integer) : integer; override;
end;
...
function XParent.XMethod(X1, X2 : integer) : integer;
begin
result := X1 + X2;
end;
function XChild.XMethod(X1, X2 : integer) : integer;
var X : integer;
begin
X := inherided XMethod; {Вызовет выполнение XMethod родителя, сложит X1 и X2}
result := X * 100;
end;
А вот если захочешь переопределить одноименные методы родителя и наследника - тогда есть другое слово - reintroduce
XParent = class
function XMethod(X1, X2 : integer) : integer; virtual;
end;
XChild = class(XParent)
function XMethod(X1, X2 : string) : integer; reintroduce;
end;
Kolan (2005-07-27 10:36:00) [2]
> Maria (27.07.05 00:03) [18]
"Перекрытие" бывает разное. Например между этажей вроде тоже перекрытие :)
jack128 (2005-07-27 00:22:00) [3]Maria (27.07.05 0:03) [18]
Как по английски зыучит перекрытие?
в литературе по программированию - override.
Maria (2005-07-27 00:03:00) [4]Как по английски зыучит перекрытие?
han_malign (2005-07-25 16:45:00) [5]> Kolan © (25.07.05 16:09) [13]
> наверно опечатка:
- угу - попутал...
Juice (2005-07-25 16:22:00) [6]
> Anatoly Podgoretsky © (25.07.05 15:52) [9]
> Juice © (25.07.05 15:47) [8]
> Дай четкое определение термина Перекрытие.
Теперь я понял этот вопрос.
Kolan (2005-07-25 16:15:00) [7]
> Мне будет проще уточнить вопрос. В чем тличие такого наследования:
1: Ты закрыл метод. Мог написать и
procedure StaticProc(S: string); итд
2: Ты перекрыл метод.
иprocedure StaticProc(S: string); override;
непройдет так как передоваемые параметры(итд смотри Help) должны быть как в предке.
Anatoly Podgoretsky (2005-07-25 16:11:00) [8]Juice © (25.07.05 16:07) [12]
Перекрытие (скрытие) статического метода.
Перекрытие (скрытие) виртуального метода.
Kolan (2005-07-25 16:09:00) [9]В
> han_malign © (25.07.05 15:08) [6]
наверно опечатка:
TChild = class(TAncestor)
public
procedure StaticProc;
procedure VirtProc; override ;
end;
?
Juice (2005-07-25 16:07:00) [10]
> А если объявить переменную как TAncestor, то не получится
Логично :)
> Дай четкое определение термина Перекрытие.
Мне будет проще уточнить вопрос. В чем тличие такого наследования:
TAncestor = class
public
procedure StaticProc;
end;
TChild = class(TAncestor)
public
procedure StaticProc;
end;
от такого:
TAncestor = class
public
procedure StaticProc; virtual;
end;
TChild = class(TAncestor)
public
procedure StaticProc; override;
end;
Только в том, что во втором варианте мы при динам. прив. типов можем выйти на метод родителя а в первом нет ? И все?
Kolan (2005-07-25 16:05:00) [11]Вы его не перекрыли а ЗАкрыли.
Если перекроетеprocedure StaticProc; override;
получите
[Error] Unit1.pas(18): Cannot override a static method
В общем если несобираетесь перекрывать тоstatic, ecли собираетесь тоvirtual
Pearled (2005-07-25 15:59:00) [12]Juice
А если объявить переменную как TAncestor, то не получится
Anatoly Podgoretsky (2005-07-25 15:52:00) [13]Juice © (25.07.05 15:47) [8]
Дай четкое определение термина Перекрытие.
Juice (2005-07-25 15:47:00) [14]Появилось 2 доп. вопроса. С overload это понятно, это перегрузка. Однако что будет в случае override вместо overload?
TAncestor = class
public
procedure StaticProc;
procedure VirtProc; virtual;
end;
TChild = class(TAncestor)
public
procedure StaticProc;
procedure VirtProc; override;
end;
И еще:
> Статический метод нельзя перекрыть.
> _Obj.StaticProc; //вызываетя TAncestor.StaticProc;
TAncestor = class
public
procedure StaticProc;
end;
TChild = class(TAncestor)
public
procedure StaticProc;
end;
procedure TAncestor.StaticProc;
begin
showmessage('yo');
end;
procedure TChild.StaticProc;
begin
showmessage('yo1');
end;
var
Child : TChild;
begin
Child := TChild.Create;
Child.StaticProc; // yo1
Получается таки перекрывается! Ошиблись ?
Kolan (2005-07-25 15:19:00) [15]
> Juice © (25.07.05 14:54) [5]
Статический метод нельзя перекрыть.
> если мы точно знаем что метод в наследниках не будет перекрываться
> то смысла обьявлять его как
Я думаю что да.
han_malign (2005-07-25 15:08:00) [16]> И в чем разница перектрытия статического метода и виртуального ?
TAncestor = class
public
procedure StaticProc;
procedure VirtProc; virtual;
end;
TChild = class(TAncestor)
public
procedure StaticProc;
procedure VirtProc; overload;
end;
..................
var _Obj: TAncestor;
begin
_Obj:= TChild.Create;
_Obj.StaticProc; //вызываетя TAncestor.StaticProc;
TChild(_Obj).StaticProc; //вызываетя TChild.StaticProc;
_Obj.VirtProc; //вызывается TChild.VirtProc;
..................
- полиморфизм в действии...
Juice (2005-07-25 14:54:00) [17]
> Lamer@fools.ua © (25.07.05 14:36) [2]
> >>Juice © (25.07.05 14:31)
>
> Метод виртуальный?
Его еще нет , как и класса.
Есть еще такой ламерский вопрос отн. пересрытия, просто уже в нескольких источниках прочитал и таки не понял смысла. Правильно ли я понимаю, что virtual и dynamic используются только при перекрытии , допустим, если мы точно знаем что метод в наследниках не будет перекрываться то смысла обьявлять его как virtual нет никакого ? И в чем разница перектрытия статического метода и виртуального ?
Гаврила (2005-07-25 14:50:00) [18]Никак. Или [3]
Anatoly Podgoretsky (2005-07-25 14:39:00) [19]Переместить в private в классе А
Lamer@fools.ua (2005-07-25 14:36:00) [20]>> Juice © (25.07.05 14:31)
Метод виртуальный?