Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Как удалить метод в наследнике ?   Найти похожие ветки 

 
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;

А вот если захочешь переопределить одноименные методы родителя и наследника - тогда есть другое слово - reintroduce

XParent = class
 function XMethod(X1, X2 : integer) : integer; virtual;
end;

XChild = class(XParent)
 function XMethod(X1, X2 : string) : integer; reintroduce;
end;



Страницы: 1 вся ветка

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

Наверх




Память: 0.52 MB
Время: 0.03 c
14-1121798060
Керк
2005-07-19 22:34
2005.08.14
Вся правда о Гагарине


6-1115185056
X-Disa
2005-05-04 09:37
2005.08.14
IdHttp.Get - многопоточное скачивание страниц!


14-1121925748
Ega23
2005-07-21 10:02
2005.08.14
С днем рождения! 21 июля


14-1122017786
Жук
2005-07-22 11:36
2005.08.14
Разбиение винта


14-1121690700
Koala
2005-07-18 16:45
2005.08.14
Ющенко намерен ликвидировать ГАИ