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

Вниз

Конструкторы   Найти похожие ветки 

 
dapher   (2005-12-15 14:16) [0]

Вопрос теоретического плана. Если назвать конструктор не словом Create а другим, что нить плохое произойдет? будет ли это вообще работать? если да, то как?
Спасибо.


 
Digitman ©   (2005-12-15 14:20) [1]


> Если назвать конструктор не словом Create а другим, что
> нить плохое произойдет?


ничего плохого не произойдет

обзови его хоть валенком, лишь бы компилятор знал, что речь идет именно о конструирующем методе класса


> будет ли это вообще работать? если да, то как?


будет работать точно так же как любой иной конструктор с любым иным именем метода


 
alex_*** ©   (2005-12-15 14:25) [2]

а как сказать компилеру что метод ххх есть конструктор? по-моему конструтор в дельфи может только Create называться


 
DesWind ©   (2005-12-15 14:30) [3]


> alex_*** ©   (15.12.05 14:25) [2]

Зарезервированое слово constructor


 
Игорь Шевченко ©   (2005-12-15 14:38) [4]

type
 TBar = class
 .....
 public
   constructor Foo;
 end;

...
constructor TBar.Foo;
begin
 inherited Create;
 ...
end;

var
 Bar: TBar;

Bar := Bar.Foo;


 
dapher   (2005-12-15 14:45) [5]

Понятно, спасибо...
А вот в каких случаях он вообще не нужен?


 
TUser ©   (2005-12-15 14:48) [6]


> А вот в каких случаях он вообще не нужен?

Конструктор?


 
dapher   (2005-12-15 14:50) [7]

да, именно он.. =)


 
Digitman ©   (2005-12-15 14:52) [8]


> в каких случаях он вообще не нужен?


в тех случаях, когда в ходе конструирования объекта не требуется явная инициализация его данных

например,

TMyClass = class(..)
 FSomeField: TSomeType;
..
 constructor Valenok;  
end;

constructor TMyClass.Valenok;
begin
 ...
 FSomeField := SomeValue; //явная инициализация поля FSomeField
 ...
end;


 
PVOzerski ©   (2005-12-15 14:56) [9]

1) Если нет классов :). Например, если вместо классов используются объекты стиля Turbo Pascal, а все методы статические;
2) Если все методы в классе объявлены как class procedure или class function, полей нет вообще, а обращение к методам идет не через переменную типа "данный класс", а напрямую.


 
Deka ©   (2005-12-15 15:15) [10]

Насколько я помню, после создания все поля обнуляются и поэтому если такие нулевые значения устраивают - конструктор не нужен. Но это частный случай [8].


 
dapher   (2005-12-15 15:20) [11]

вот если я создаю такой вот класс:

TMyClass = class
 FSomeField1: TSomeType1;
 FSomeField2: TSomeType2;

 procedure SomeMethod;
end;

нужен конструктор? я так понимаю, что не нужен... или все-таки?
могу ли использовать вот так:

procedure SomeProc;
var
 obj: TMyClass;
begin
 obj.FSomeField1:=SomeValue;
 obj.SomeMethod;
end;


 
PVOzerski ©   (2005-12-15 15:21) [12]

Осмелюсь напомнить, что переменная типа класс до присвоения ей чего-либо - nil или мусор. А присвоение бывает либо результата вызова конструктора, либо значения другой переменной (но тогда онабудет ссылаться на те же самые данные), либо это какие-то трюки, мало пригодные к рекомендованию.


 
PVOzerski ©   (2005-12-15 15:25) [13]

2dapher: так присваивать нельзя. Другое дело, что ты не обязан свой конструктор описывать. Всякий класс - по умолчанию наследник TObject, который имеет предопределенный метод Create. Если тебя он устраивает - вызывай его. Равно как у тебя уже есть деструктор Destroy и метод Free.

procedure SomeProc;
var
obj: TMyClass;
begin
obj := TMyClass.Create; //здесь вызовется конструктор, унаследованный от TObject
obj.FSomeField1:=SomeValue;
obj.SomeMethod;
obj.Free;
end;


 
Джо ©   (2005-12-15 15:27) [14]

Главное, деструктор Destroy"ем назвать.


 
dapher   (2005-12-15 15:31) [15]

"Всякий класс - по умолчанию наследник TObject" - теперь все понятно! =) большое спасибо!


 
PVOzerski ©   (2005-12-15 15:32) [16]

2Джо: это важно, только если ты используешь стандартный Free. Тогда, кстати, Destroy еще и надо обязательно объявлять Override.


 
Anatoly Podgoretsky ©   (2005-12-15 15:51) [17]

Если класс является компонентом, помещаемым на палитру, то при этом автоматически будет вызываться конструктор с именем Create



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

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

Наверх





Память: 0.48 MB
Время: 0.011 c
14-1133853822
nk
2005-12-06 10:23
2006.01.01
Кто может подсказать...


2-1134829134
kotbazilio
2005-12-17 17:18
2006.01.01
Разника между датами


2-1134576874
Змей
2005-12-14 19:14
2006.01.01
отлавливание sc_minimize


8-1122063113
Retryator
2005-07-23 00:11
2006.01.01
Графические Аппертуры


2-1134452961
Alex_C
2005-12-13 08:49
2006.01.01
Определение строчки в RichEdit





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