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