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

Вниз

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

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

Наверх




Память: 0.73 MB
Время: 0.04 c
1-1189580697
cantalia
2007-09-12 11:04
2007.12.02
Событие из DLL в Main Application


11-1178473386
Dmitry___
2007-05-06 21:43
2007.12.02
KOLProject - Build := TRUE


15-1192084197
de.
2007-10-11 10:29
2007.12.02
to Delphi 7


2-1194528227
ЗфдЗфднср
2007-11-08 16:23
2007.12.02
оптимизация использования Ttimer


1-1189687888
Андрей Пл
2007-09-13 16:51
2007.12.02
TDBChart есть ли у компонента метод наподобие Print Preview?