Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удалить метод в наследнике ?


Страницы:   1 2

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)

Метод виртуальный?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо