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

Вниз

Delphi and C#   Найти похожие ветки 

 
Пит   (2014-06-10 14:26) [40]


> а есть специальные  мета-методы которые магически вызывают
> NewInstance{InitInstance} и FreeInstance{CleanupInstance}.
> ..

и называются конструкторы и деструкторы.
В других языках как то также.


 
sms   (2014-06-10 18:03) [41]


> который ничего не делает, то есть по крайней мере не вызывает
> конструктор предка.
а в моем примере делает :)


 
Пит   (2014-06-10 21:03) [42]


> а в моем примере делает :)

в посте [14] ?

Не должна переменная инициализироваться числом 100 при вызове new B


 
Inovet ©   (2014-06-10 21:57) [43]

> [42] Пит   (10.06.14 21:03)

Это что же получается, если я не написал дефолтный конструктор и явно не вызвал конструктор предка, то кирдык инициализации объекта? Ужас.


 
Romkin ©   (2014-06-11 10:51) [44]


> В большинстве других известных языков наследования конструкторов
> нету!

Надо говорить "в большинстве известных мне..."
Objective-C и Python следят за тобой с интересом :)


 
Пит   (2014-06-11 11:04) [45]


> Надо говорить

а как ты интерпретировал слово "в большинстве"? )


 
Romkin ©   (2014-06-11 11:19) [46]


> а как ты интерпретировал слово "в большинстве"? )

Как неточность. "в большинстве известных". Сейчас все больше языков с метаклассами среди популярных, на мой взгляд.


 
Inovet ©   (2014-06-11 11:37) [47]

> [43] Inovet ©   (10.06.14 21:57)
> > [42] Пит   (10.06.14 21:03)


Уффф, отлегло

class CA
{
 int v;
public:
 CA() {v = 1234567;}
 CA(int Val) {v = Val;}

 GetVal() {return v;}
};

class CB : public CA
{
 public:
 CB() {;}
 CB(int Val) : CA(Val) {;}
};

int _tmain(int argc, _TCHAR* argv[])
{
 CB b1;
 CB b2(2345678);
 printf("b1 = %i, b2 = %i", b1.GetVal(), b2.GetVal());
 getchar();
 return 0;
}

Вывод:
b1 = 1234567, b2 = 2345678


Или ты об чём?


 
Пит   (2014-06-11 11:48) [48]


> b1 = 1234567

и как ты это объяснишь? Ты же явно объявил  у CB конструктор, который ничего не делает, в том числе не вызывает конструктор предка (Base) или в понятиях дельфи не делает inherited, почему же тогда произошла инициализация переменной?

Может Jack128 придет и объяснит...


 
han_malign   (2014-06-11 12:05) [49]


> в том числе не вызывает конструктор предка

- конструктор - на то и конструктор, что вызывается всегда - для каждого включаемого класса, в том числе - включаемого по наследованию...
Внесите "пустой"  конструктор базового класса в private секцию - и будет вам полное просветление...


 
Inovet ©   (2014-06-11 12:20) [50]

> [48] Пит   (11.06.14 11:48)
> и как ты это объяснишь?

Ну так вызывается же, надо в стандарте смотреть точные формулировки

class CA
{
 int v;
public:
 CA() {v = 1234567; printf("CA()\n");}
 CA(int Val) {v = Val; printf("CA(int Val)\n");}

 GetVal() {return v;}
};

class CB : public CA
{
public:
 CB() {printf("CB()\n");}
 CB(int Val) : CA(Val) {printf("CB(int Val)\n");}
};

int _tmain(int argc, _TCHAR* argv[])
{
 CB b1;
 CB b2(2345678);
 printf("b1 = %i, b2 = %i", b1.GetVal(), b2.GetVal());
 getchar();
 return 0;
}

Вывод:

CA()
CB()
CA(int Val)
CB(int Val)
b1 = 1234567, b2 = 2345678


 
Пит   (2014-06-11 12:22) [51]


> конструктор - на то и конструктор, что вызывается всегда
> - для каждого включаемого класса

ниче не понял. А я слышал мнение, что в дельфи конструктор предка вызовется, если только inherited написать


 
Romkin ©   (2014-06-11 12:35) [52]

Delphi вызывает NewInstance, а дальше код конструктора. Есть вызов предка - вызовется. Точная ситуация как и с обычным методом. Но почему-то явный вызов inherited в виртуальном методе не беспокоит, а вот в конструкторе вызывает недоумение.


 
Пит   (2014-06-11 12:54) [53]


> Вывод:
>
> CA()
> CB()

удивительно. Еще и конструктор CA первым вызвался. Я не понимаю, почему. Может кто пояснит.


 
Inovet ©   (2014-06-11 14:08) [54]

> [53] Пит   (11.06.14 12:54)
> Я не понимаю, почему

Ну так базовый класс должен быть инициализирован, прежде чем наследник будет что-то там с его и со своими данными делать.


 
Inovet ©   (2014-06-11 14:12) [55]

А, ну ты может про это
 CB(int Val) : CA(Val) {printf("CB(int Val)\n");}
так если сделать так
 CB(int Val) {printf("CB(int Val)\n");}
то тоже вызовется дефолтный
 CA()
.
Мало ли чего и зачем мы там передали в
CB(int Val)


 
Пит   (2014-06-11 14:24) [56]


> так если сделать так
>  CB(int Val) {printf("CB(int Val)\n");}
> то тоже вызовется дефолтный
>  CA()

а вот почему?!?!

Такого уже даже и в дельфи нету, чтобы вызвать метод у предка всегда нужно фигачить Inherited.


 
Пит   (2014-06-11 14:25) [57]

ничего не понимаю


 
jack128_   (2014-06-12 22:09) [58]


> а вот почему?!?!

а почему когда ты вызываешь TMyObject.Create()  вызывается не только тело конструктора Create, но и InitInstance  ?  Потому что так решили разработчики языка.


 
картман ©   (2014-06-12 22:57) [59]


> han_malign   (10.06.14 12:20) [38]
>
>
> >  наследуется-не наследуется?
>
> - в Delphi нет конструкторов и деструкторов, а есть специальные
>  мета-методы

да какая разница-то? Есть язык, пишешь в соответствии с его спецификой - все. Дальше все одинаковое, хоть дельфи, хоть си шарп, хоть что угодно.  Бухгалтерия все та же.


 
Пит   (2014-06-13 19:26) [60]


> Потому что так решили разработчики языка.
>

подожди, ты же сам мне объяснял...
Почему в примере [50] вызывается конструктор CA вообще?!

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

А из примера видно, что несмотря на объявленный конструктор - СНАЧАЛА вызывается конструктор предка... Что это вообще такое?! Какая тогда логика вызова всё таки в шарпе?


 
ухты   (2014-06-13 19:40) [61]

[50] это не шарп, но в шарпе тоже самое


 
Inovet ©   (2014-06-13 21:22) [62]

> [60] Пит   (13.06.14 19:26)
> Какая тогда логика вызова всё таки в шарпе?

Ну, как уже замечено, это не шарп, но смысл то же. Помню, у меня непонимание возникло в одном вопросе по физике после лекции. Вот вроде понятно всё, а не понятно зачем оно надо. Ну и чё - между парами в курилке возле лифта спросил об этом курильщиков, затягиваясь сам отравой, - Чё это вообще за нафиг? Так один мне объясинл на пальцах за 1 минуту, но я нифига не понял, а другой объяснил ещё за одну минуту, и я уже понял.

И мы пошли на следующее занятие вооружонные знанием.

Да. Наверное этот пост тоже политически окрашен и будет удалён?


 
jack128_   (2014-06-14 01:00) [63]


> Что это вообще такое?! Какая тогда логика вызова всё таки
> в шарпе?

Перед вызовом конструктора класса вызывается конструктор базового класса.  Всегда. Если не указано явно какой именно конструктор базового класса нужно вызвать, то вызывается конструктор по умолчанию(=конструктор без параметров). Если конструктор по умолчанию недоступен(его нету, или он объявлен в предке как private), то будет ошибка компиляции.


 
Пит   (2014-06-14 10:13) [64]

Блин а я был уверен, что как и в дельфе конструкторы предка надо вызывать только вручную...


 
Пит   (2014-06-14 16:30) [65]


> Перед вызовом конструктора класса вызывается конструктор
> базового класса

подожди, Жень... А если я хочу реализовать дельфовое поведение?

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

На примере шарпа, допустим


 
jack128_   (2014-06-14 16:46) [66]

На примере плюсов:
class A {
public:
   A(int data){}
};

class B: A {
public:
   B(): A(GetDataFromNetwork()){}
   int x = 10;
private:
   static int GetDataFromNetwork() {
       return 1;
   }
};


 
Пит   (2014-06-14 18:35) [67]

хитрооо ))


 
DVM ©   (2014-06-14 19:22) [68]


> Пит   (14.06.14 16:30) [65]


> А если я хочу реализовать дельфовое поведение?


> На примере шарпа, допустим

вот тут обсуждали http://www.rsdn.ru/forum/dotnet/3428511.flat там и jack128 и григорьев :)


 
Внук ©   (2014-06-14 20:16) [69]

>>Пит   (11.06.14 14:24) [56]

type
 TA = class
 private
   FFoo: string;
 ...
   public
      constructor Create;
 end;

...

constructor TA.Create;
begin
 FFoo := "Bar";
end;

procedure SomeMethod;
var
 A: TA;
begin
 A := TA.Create;  // Конструктор предка будет вызван без всяких inherited
 ...
end;


 
jack128_   (2014-06-14 20:21) [70]

2Внук ?? Какого предка ??? Tobject что ли? Нет, не будет вызван.


 
brother ©   (2014-06-14 20:32) [71]

Я не понимаю о чем сыр-бор:
type
TA = class
private
  FFoo: string;
public
  constructor Create;
end;

TB = class(TA)
  constructor Create;
end;
...
constructor TA.Create;
begin
FFoo := "Bar";
end;

constructor TB.Create;
begin
inherited; // вызываем конструктор предка класса
FFoo := "Bar2";
end;
...
var
 B: TB;
begin
 b:= TB.Create;
end;


если inherited не делать, то конструктор TA вызван не будет...


 
brother ©   (2014-06-14 20:46) [72]

ps. конструктор Tobject вызван не будет...


 
brother ©   (2014-06-14 20:49) [73]

> Допустим, при создании моего класса TB, который я отнаследовал
> от TA - я хочу, чтобы сначала получил управление я, что-
> то нашаманить, может даже получить данные по сети или типа
> того, а потом уже вызвать конструктор базового класса TA,
> передав динамически полученные параметры, как это сделать?

constructor TB.Create;
begin
шаманим первые)
inherited;  

end;


 
Внук ©   (2014-06-14 20:52) [74]

>>jack128_   (14.06.14 20:21) [70]
Да. Не то написал. Имел в виду, что объект будет корректно создан без вызова конструктора предка. Вобщем, ерунду написал.


 
ухты   (2014-06-14 23:56) [75]

static и "чтобы сначала получил управление я", как бы не одно и тоже
в паблик static вывести и "шамать" перешамань


 
Пит   (2014-06-15 04:04) [76]

Удалено модератором


 
ухты   (2014-06-15 08:32) [77]

Удалено модератором


 
Предавший Паскаль   (2014-06-15 09:41) [78]

Где-то слышал такое выражение:
"Delphi - он добрый. :)".

Все что не он, агрессоры.


 
Пит   (2014-06-15 12:16) [79]


> На примере плюсов:

Жень, а если я хочу создать класс-наследник с конструктором без параметров и чтобы СНАЧАЛА мой конструктор получил управление, а потом уже вызвать конструктор предка?


 
jack128_   (2014-06-15 19:22) [80]

Зачем?



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

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

Наверх





Память: 0.61 MB
Время: 0.005 c
15-1402950602
Юрий
2014-06-17 00:30
2015.01.18
С днем рождения ! 17 июня 2014 вторник


2-1387193293
Павел
2013-12-16 15:28
2015.01.18
Проблема переноса проекта в XE2


15-1402045300
Palladin
2014-06-06 13:01
2015.01.18
Ищу работу


15-1402811253
Библиарий
2014-06-15 09:47
2015.01.18
Как этот простой подход/паттерн/не знаю называется?


15-1402311626
KilkennyCat
2014-06-09 15:00
2015.01.18
Delphi + Asterisk





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