Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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;

А вот если захочешь переопределить одноименные методы родителя и наследника - тогда есть другое слово - 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.013 c
1-1122284113
sarcin
2005-07-25 13:35
2005.08.14
Resize функция для IntraWeb


3-1116008648
Fatal
2005-05-13 22:24
2005.08.14
Прямой коннект к БД Oracle.


14-1121764299
Alexander Panov
2005-07-19 13:11
2005.08.14
Это демократия и рынок.


3-1120653967
Ольга
2005-07-06 16:46
2005.08.14
SQL - запрос на удаление по условию


3-1120541716
Ландграф Павел
2005-07-05 09:35
2005.08.14
Access через ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский