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

Вниз

Еще раз про class of   Найти похожие ветки 

 
Igorek   (2002-08-02 13:02) [0]

Вот такой код.
unit Unit2;

interface
type
TA = class
end;
TB = class (TA)
end;
TC = class (TA)
end;
TTA = class of TA;
var
vb: TB;
vc: TC;
refta: TTA;
implementation

procedure P2;
begin
refta := TB;
end;

procedure P1;
begin
P2;
//ниже что-то типа vb := refta.Create
//или
// if refta.InheritsFrom(vb.ClassType) then
// vb := vb.ClassType(refta.Create)

if refta.InheritsFrom(vb.ClassType) then
vb := TB(refta.Create)
else
if refta.InheritsFrom(TC) then
vc := TC(refta.Create)
else
//error
;
end;

end.

Как в теле процедуры P1 избежать прямого использования названий типов TB и TC?

Если такой вопрос уже был, то можете просто сказать об этом - я поищу.


 
DiamondShark   (2002-08-02 13:22) [1]

А по-русски слабо рассказать, что нужно?

Приведенный код мало, что бессмысленный, так еще и с ошибками.


 
Юрий Зотов   (2002-08-02 14:28) [2]

> //ниже что-то типа vb := refta.Create

Просто раскомментируйте эту строку и закомментируйте последующие.
Получим:

procedure P1;
begin
P2;
vb := refta.Create //Создаст экземпляр класса, который назначен в P2
end;


 
Igorek   (2002-08-02 15:04) [3]

2 Юрий Зотов © (02.08.02 14:28)

> Просто раскомментируйте эту строку и закомментируйте последующие.
> Получим:
>
> procedure P1;
> begin
> P2;
> vb := refta.Create //Создаст экземпляр класса, который назначен
> в P2

Спасибо за ответ.
Но компилятор не пропустит - Incompatible types TA and TB.
В этом и вся проблема.

2 DiamondShark © (02.08.02 13:22)
Ошибок в коде нет и сказал я достаточно.


 
Старый Паскалист   (2002-08-02 15:07) [4]

Igorek © Ты не сказал самого главного - зачем тебе это нужно.
В чём состоит идея?

И вообще, динамическое создание экземпляра неизвестного типа имеет смысл только при наличии виртуального конструктора.
(За исключением вырожденных случаев).


 
Igorek   (2002-08-02 15:21) [5]

2 Старый Паскалист (02.08.02 15:07)

> В чём состоит идея?

А какая разница? Есть четко сформулированная проблема.

> И вообще, динамическое создание экземпляра неизвестного
> типа имеет смысл только при наличии виртуального конструктора.

Естесно. Просто я его для простоты не написал.


 
MBo   (2002-08-02 15:26) [6]

>Но компилятор не пропустит - Incompatible types TA and TB.
так объяви vb как TA


 
DiamondShark   (2002-08-02 15:27) [7]


if refta.InheritsFrom(vb.ClassType) then
^Здесь ошибка
vb := TB(refta.Create)
else
if refta.InheritsFrom(TC) then
vc := TC(refta.Create)
else
//error


А закидоны Вы бросьте. Хотите ответа, так выражайтесь так чтоб Вас поняли.


 
Igorek   (2002-08-02 15:35) [8]

2 DiamondShark © (02.08.02 15:27)

> А закидоны Вы бросьте. Хотите ответа, так выражайтесь так
> чтоб Вас поняли.

Ну какие закидоны, уважаемый? Предельно точно сформулированная проблема.

И все равно не вижу ошибки - и компилится и выполняется. Даже мастера ничего не заметили.

2 MBo © (02.08.02 15:26)

> так объяви vb как TA

Дело в том, что это проблема не конкретная, а пример более общего случая. Так что условие не меняется.


 
DiamondShark   (2002-08-02 15:44) [9]


> А какая разница? Есть четко сформулированная проблема


Ну вы, товарищ, совсем...

Таких проблем я могу четко наформулировать мульен.

Вот предложу вам нечто склепанное из пустых бочек, грубо отесаных досок и ящиков для стеклотары, а потом предложу вам объянить мне, почему это не летает. А на справедливый вопрос "это что за хрень такая" встану в позу и заявлю что "я все сказал"


 
MBo   (2002-08-02 15:47) [10]

>Дело в том, что это проблема не конкретная, а пример более общего случая. Так что условие не меняется.
Как бы то ни было, придется использовать общего предка, но не наоборот

пример, создающий контрол введенного в edit1 имени класса, если такие уже имеются на форме (иначе RegisterClass понадобится)
используется общий предок TWinControl

function TForm1.FindSuch(Root:TComponent;const s: String): TComponent;
var i:integer;
begin
Result:=nil;
for i:=0 to root.componentcount-1 do begin
if sametext(root.Components[i].classname,s) then begin
Result:=Root.Components[i];
Break;
end;
end;
end;

procedure TForm1.Button6Click(Sender: TObject);
type
TWCClass = class of TWinControl;
var
Obj:TWinControl;
ObjClass:TWCClass;
s:string;
c:tcomponent;
begin
s:=edit1.text;
c:=FindSuch(TComponent(self),s);
if c<> nil then begin
ObjClass:=TWCClass(c.classtype);
if ObjClass<>nil then begin
Obj:=ObjClass.Create(self);
Obj.Parent:=self;
Obj.SetBounds(10,10,100,20);
end;
end;
end;


 
Igorek   (2002-08-02 15:52) [11]

2 DiamondShark © (02.08.02 15:44)

> Ну вы, товарищ, совсем...
>
> Таких проблем я могу четко наформулировать мульен.

Так формулируйте себе, на здоровье. Не нравиться данная формулировка - игнорируйте.

Чем же я именно Вас так задел? Вроде никто больше не возмущается.


 
vuk   (2002-08-02 15:55) [12]

TObject(vb) := refta.Create


 
DiamondShark   (2002-08-02 16:03) [13]


> Ну какие закидоны, уважаемый? Предельно точно сформулированная
> проблема.


Закидоны в том, что вы становитесь в позу типа "не въехал -- значит не твоего ума дело"

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

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


> И все равно не вижу ошибки - и компилится и выполняется.
> Даже мастера ничего не заметили.


Вот такой код

var
P: PInteger;
begin
P^ := 1234;
end;

Несомненно будет компилироваться, и временами даже исполняться.

Экземпляр для vb нигде не создается. А между тем, ClassType обычный метод, не классовый, и работает он, между прочим, с указателем Self, который вы не потрудились инициализировать.


 
vuk   (2002-08-02 16:11) [14]

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



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

Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
3-47914
Larisa
2002-07-24 13:12
2002.08.15
Внесение новой записи в БД


8-48212
mari_ra
2002-04-11 13:22
2002.08.15
Как повернуть мета-файл без использования SetWorldTransform?


3-47966
UnDISCOvery
2002-07-26 12:24
2002.08.15
Как создать файл БД Access динамически ?


3-47928
Explorer
2002-07-25 10:11
2002.08.15
Запрос на Max значения


14-48300
Lola
2002-07-17 15:44
2002.08.15
Лето... Жара... Все на пляж!!!





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