Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизКак удалить метод в наследнике ? Найти похожие ветки
← →
Juice © (2005-07-25 14:31) [0]Класс А содержит паблик-метод М, класс Б наследуется от А. Вопрос: как сделать так, чтобы класс Б не содержал метода М ?
← →
Ega23 © (2005-07-25 14:33) [1]Перекрыть этот метод в private-секции Б?
← →
Lamer@fools.ua © (2005-07-25 14:36) [2]>>Juice © (25.07.05 14:31)
Метод виртуальный?
← →
Anatoly Podgoretsky © (2005-07-25 14:39) [3]Переместить в private в классе А
← →
Гаврила © (2005-07-25 14:50) [4]Никак. Или [3]
← →
Juice © (2005-07-25 14:54) [5]
> Lamer@fools.ua © (25.07.05 14:36) [2]
> >>Juice © (25.07.05 14:31)
>
> Метод виртуальный?
Его еще нет , как и класса.
Есть еще такой ламерский вопрос отн. пересрытия, просто уже в нескольких источниках прочитал и таки не понял смысла. Правильно ли я понимаю, что virtual и dynamic используются только при перекрытии , допустим, если мы точно знаем что метод в наследниках не будет перекрываться то смысла обьявлять его как virtual нет никакого ? И в чем разница перектрытия статического метода и виртуального ?
← →
han_malign © (2005-07-25 15:08) [6]>И в чем разница перектрытия статического метода и виртуального ?
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;
..................
- полиморфизм в действии...
← →
Kolan © (2005-07-25 15:19) [7]
> Juice © (25.07.05 14:54) [5]
Статический метод нельзя перекрыть.
> если мы точно знаем что метод в наследниках не будет перекрываться
> то смысла обьявлять его как
Я думаю что да.
← →
Juice © (2005-07-25 15:47) [8]Появилось 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
Получается таки перекрывается! Ошиблись ?
← →
Anatoly Podgoretsky © (2005-07-25 15:52) [9]Juice © (25.07.05 15:47) [8]
Дай четкое определение термина Перекрытие.
← →
Pearled © (2005-07-25 15:59) [10]Juice
А если объявить переменную как TAncestor, то не получится
← →
Kolan © (2005-07-25 16:05) [11]Вы его не перекрыли а ЗАкрыли.
Если перекроетеprocedure StaticProc; override;
получите[Error] Unit1.pas(18): Cannot override a static method
В общем если несобираетесь перекрывать тоstatic
, ecли собираетесь тоvirtual
← →
Juice © (2005-07-25 16:07) [12]
> А если объявить переменную как 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:09) [13]В
> han_malign © (25.07.05 15:08) [6]
наверно опечатка:TChild = class(TAncestor)
public
procedure StaticProc;
procedure VirtProc; override;
end;
?
← →
Anatoly Podgoretsky © (2005-07-25 16:11) [14]Juice © (25.07.05 16:07) [12]
Перекрытие (скрытие) статического метода.
Перекрытие (скрытие) виртуального метода.
← →
Kolan © (2005-07-25 16:15) [15]
> Мне будет проще уточнить вопрос. В чем тличие такого наследования:
1: Ты закрыл метод. Мог написать и
procedure StaticProc(S: string); итд
2: Ты перекрыл метод.
иprocedure StaticProc(S: string); override;
непройдет так как передоваемые параметры(итд смотри Help) должны быть как в предке.
← →
Juice © (2005-07-25 16:22) [16]
> Anatoly Podgoretsky © (25.07.05 15:52) [9]
> Juice © (25.07.05 15:47) [8]
> Дай четкое определение термина Перекрытие.
Теперь я понял этот вопрос.
← →
han_malign © (2005-07-25 16:45) [17]>Kolan © (25.07.05 16:09) [13]
>наверно опечатка:
- угу - попутал...
← →
Maria (2005-07-27 00:03) [18]Как по английски зыучит перекрытие?
← →
jack128 © (2005-07-27 00:22) [19]Maria (27.07.05 0:03) [18]
Как по английски зыучит перекрытие?
в литературе по программированию - override.
← →
Kolan © (2005-07-27 10:36) [20]
> Maria (27.07.05 00:03) [18]
"Перекрытие" бывает разное. Например между этажей вроде тоже перекрытие :)
← →
Begin (2005-07-27 13:31) [21]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;
А вот если захочешь переопределить одноименные методы родителя и наследника - тогда есть другое слово - reintroduceXParent = class
function XMethod(X1, X2 : integer) : integer; virtual;
end;
XChild = class(XParent)
function XMethod(X1, X2 : string) : integer; reintroduce;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c