Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.09.15;
Скачать: [xml.tar.bz2];

Вниз

команнда для перекрытия конструктора   Найти похожие ветки 

 
SKIPtr ©   (2013-01-01 10:48) [0]

драсте
простите возможно за детский вопрос но вот не ясно
просматривал в интернете варианты написания конструктора
и вот в одних примерах пишут
constructor Create ( AOwner : TComponent ) ; override ;

а в других
constructor Create ( AOwner : TComponent ) ; overload ;

в чем разница
и какой вариант лучше использовать


 
bems ©   (2013-01-01 10:56) [1]

эти варианты не только для конструктора
overload добавляет вторую функцию с тем же именем (то есть если ты хочешь два create"а в одном классе) но другим набором параметров, а override перекрывает виртуальный метод


 
SKIPtr ©   (2013-01-01 11:00) [2]

тогда насколько я понимаю вариант
constructor Create ( AOwner : TComponent ) ; overload ;
неправильный и возможно даже не будет работать


 
SKIPtr ©   (2013-01-01 11:07) [3]


> неправильный и возможно даже не будет работать

ой подробней опишу
вот как написан клас

TLisForm = class(TForm)
  constructor Create ( AOwner : TComponent ) ; overload ;
end;


 
bems ©   (2013-01-01 11:10) [4]

ну тут overload не нужен, хоть оно и скомпилится


 
SKIPtr ©   (2013-01-01 11:34) [5]


> тут overload не нужен,

значит нужно только override
в паскале проще было там вопще не чего не надо было ставить


 
bems ©   (2013-01-01 14:25) [6]

тут тоже можно ничего не ставить


 
Юрий Зотов ©   (2013-01-01 16:41) [7]


> bems ©   (01.01.13 14:25) [6]
> тут тоже можно ничего не ставить

Нельзя.


 
Юрий Зотов ©   (2013-01-01 16:50) [8]


> SKIPtr ©   (01.01.13 11:34) [5]

Override означает перекрытие виртуального или динамического метода предка.

Overload означает перегрузку - объявление еще одного метода (функции, процедуры) с тем же именем, что уже было, но с другим набором параметров.

То есть, override и overload - вещи разные и между собой не связанные.


 
Юрий Зотов ©   (2013-01-01 17:03) [9]


> bems ©   (01.01.13 14:25) [6]

Видимо, надо все же обосновать. Если при перекрытии динамического или виртуального метода (в том числе, конструктора) не поставить никаких описателей, то разрывается цепочка наследования этого метода и начинается новая - о чем предупреждает компилятор:
Method X hides virtual method of base type Y

Опасно, однако не это, а то, что "перекрытый" таким образом метод может вообще не вызваться. Вот пример:

type
 TForm1 = class(TForm)
 public
   constructor Create(AOwner: TComponent);
 end;

constructor TForm1.Create(AOwner: TComponent);
begin
 inherited;
 Caption := "Вызвался";
end;

Запускаем программу и видим, что Caption не изменилось  - то есть, наш конструктор не вызвался. Тогда ставим описатель override, снова запускаем программу и видим, что все стало нормально.


 
SKIPtr ©   (2013-01-01 18:21) [10]


> видим, что Caption не изменилось  - то есть, наш конструктор
> не вызвался.

во как интересно
описаный метод не вызываеться

спасибо за ответы сажусь писать
но вот посоветуйте правильно я обявил замену конструктора класа TMyForm

TLisForm = class(TForm)
  constructor Create ( AOwner : TComponent ) ; Override ;
end;

TMyForm = class(TLisForm)
 constructor Create ( AOwner : TComponent; d : Integer ) ; overload ;
end;


 
Юрий Зотов ©   (2013-01-01 18:44) [11]


> SKIPtr ©   (01.01.13 18:21) [10]

Проще дать второму конструктору другое имя. И если у TMyForm предполагаются наследники, то делайте этот конструктор виртуальным.

Только зачем все это? Нередко необходимость в подобной экзотике бывает вызвана выбором изначально плохого решения - тогда надо решение пересматривать, а не конструкторы плодить.

В чем суть задачи?


 
SKIPtr ©   (2013-01-01 20:12) [12]

TLisForm это будет как бы мой универсальный модуль
его я буду ставить там где нужно динамически создавать некоторое количество каких либо форм
созданые формы будут распологаться в масиве типа TList
тут конструктор будет искать место в TList и расположит его там
в классе в переменую MyHandle будет записано его место в TList

TMyForm это и есть сама конечная форма
там в конструкторе выполню все то что нужно сделать для конечной формы
создавать буду обьект класса  TMyForm
его конструктор сделает то что нужно самой форме
потм через inherited вызоветься конструктор TLisForm который расположит себя в списке и вызовит  inherited Create чтоб выполнить конструктор TForm

вот примерно так все будет


 
bems ©   (2013-01-01 20:18) [13]


> Нельзя.

можно. И да, я в курсе что это разрывает цепочку, спасибо. Когда я сказал что можно, имел в виду только что такое объявление корректно. А будет ли оно работать как надо, зависит от того что хочет получить ОП.


 
KilkennyCat ©   (2013-01-02 02:03) [14]

кстати, это удобно при отключении своего метода - закомментировав всего в одном месте.


 
Германн ©   (2013-01-02 02:12) [15]


> SKIPtr ©   (01.01.13 20:12) [12]
>
> TLisForm это будет как бы мой универсальный модуль
> его я буду ставить там где нужно динамически создавать некоторое
> количество каких либо форм
> созданые формы будут распологаться в масиве типа TList

А не путаете ли вы понятия "класс" и "модуль"?


 
SKIPtr ©   (2013-01-02 08:03) [16]


> А не путаете ли вы понятия "класс" и "модуль"?

класс TLisForm будет находиться в отдельном модоле
модоль будет испольхован когда нужно использовать динасмчески создаваемые массив форм



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

Форум: "Начинающим";
Текущий архив: 2013.09.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.002 c
15-1365042070
Думкин_
2013-04-04 06:21
2013.09.15
404 - всех с Днем!


15-1365197648
Чайник
2013-04-06 01:34
2013.09.15
Нич-чо не понимаю!


2-1356680112
aka
2012-12-28 11:35
2013.09.15
Работа с указателями


15-1365199357
Дмитрий С
2013-04-06 02:02
2013.09.15
Переменные окружения и COM объект.


3-1292492845
RWolf
2010-12-16 12:47
2013.09.15
ClientDataSet: Insufficient memory for this operation





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский