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

Вниз

смогу ли я быть программистом   Найти похожие ветки 

 
@!!ex ©   (2007-10-26 17:52) [160]

> [159] KSergey ©   (26.10.07 17:45)

Это не объясянет, почему нельзя передать в качестве параметра наследника класса, который требуется передать. Ведь наследник в точности повторяет структуру родителя+ еще свои поля имеет, которые будут просто игнорироваться.


 
KSergey ©   (2007-10-26 18:22) [161]

> @!!ex ©   (26.10.07 17:52) [160]
> > [159] KSergey ©   (26.10.07 17:45)
>
> Это не объясянет, почему нельзя передать в качестве параметра
> наследника класса, который требуется передать. Ведь наследник
> в точности повторяет структуру родителя+ еще свои поля имеет,
>  которые будут просто игнорироваться.

Однако и это понятно: причина - в природе "ссылок на классы" в дельфи.
И в самом деле: эти самые ссылки - по сути указатели на объект. На занимаемую объектом память.
Пусть есть

TClassA = class
...
end;

TClassB = class(TClassA)
...
end;

procedure SomeProc(var aClass: TClassA);
begin
  aClass := TClassB.Create;
end;


И вот теперь представьте: передаем по сути указатель на указатель (crux, привет!) свято веря внутри SomeProc, что имеем дело с объектом А, а вот вызывающая функция как раз подразумевает, что ей вернули ссылку на B, и начинает с ним работать как с В. Пипец, правда?

Пока писал это, в голову пришел даже еще более плохой пример:

TClassA = class ... end;
TClassB = class(TClassA) ... end;
TClassС = class(TClassA) ... end;

procedure SomeProc(var aClass: TClassA);
begin
  aClass := TClassB.Create;
end;


Представьте что будет, если вызывающая функция будет выглядеть так:

var
  cl: TClassC;
begin
  SomeProc(cl);
...


Т.е. SomeProc законно присваивает параметру ссылку на TClassB, в то время как вызывающая далее работает с С!!!

А вот в С++ таких проблем не возникает, т.к. там если передается ссылка - то гарантированно на готовый экземпляр.


 
KSergey ©   (2007-10-26 18:25) [162]

Сорри. Поправки.

> KSergey ©   (26.10.07 18:22) [161]
> в природе "ссылок на классы" в дельфи.

В природе "ссылок на экземпляры" конечно же.

И в первом примере должно быть так:

TClassA = class
end;

TClassB = class(TClassA)
end;

procedure SomeProc(var aClass: TClassA);
begin
  aClass := TClassА.Create;
end;


 
@!!ex ©   (2007-10-26 19:18) [163]

> [161] KSergey ©   (26.10.07 18:22)

Спасибо!
То что нужно. Все, я понял теперь. Это за доказательство сойдет.



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

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

Наверх




Память: 0.71 MB
Время: 0.057 c
2-1194706325
no3ep
2007-11-10 17:52
2007.12.02
изменение времени


2-1194007806
MZ_Organize
2007-11-02 15:50
2007.12.02
раскалдка с англ. на рус. и с рус. на анлг


15-1193597756
vpbar
2007-10-28 21:55
2007.12.02
Шрифт в объекте Формула (Microsoft Equation)


2-1194433943
LexXL
2007-11-07 14:12
2007.12.02
вписать картинку в квадрат


2-1194513868
PRIVET
2007-11-08 12:24
2007.12.02
Визуализация сортировки





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