Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.01.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.01 c
2-1387265285
aka
2013-12-17 11:28
2015.01.18
Что быстрее будет работать?


11-1257251317
Игорь Шевченко
2009-11-03 15:28
2015.01.18
Прошу прощения, по ошибке закрыл ветку "Использование MakeMethod"


15-1401723069
Dennis I. Komarov
2014-06-02 19:31
2015.01.18
CDO


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


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