Форум: "Начинающим";
Текущий архив: 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