Casa
Top.Mail.Ru Yandeks.Metrika
Fórum: "Principal";
Arquivo atual: 2004.02.02;
Download: [xml.tar.bz2];

Para baixo

Crie uma variável da classe atual. Encontre agências semelhantes


tria   (2004-01-21 14:29) [0]

A questão é a seguinte. Existe uma hierarquia:
TBaseClass = Classe;
TClass1 = Classe (TBaseClass);
TClass2 = Classe (TBaseClass1);
TClass11 = Classe (TBaseClass);

Existe um procedimento no gato. variável de classe passada:
procedimento Proc1 (p: TBaseClass);
var p1: TBaseClass;
começar
p1: = TBaseClass.Create;
... e outra coisa ...
end;

A variável p pode ser qualquer um dos tipos acima (TClass1, TClass2, TClass11).
Tarefa: crie p1 do mesmo tipo que o parâmetro realmente transmitido.



Skier   (2004-01-21 14:32) [1]

use uma metaclasse.



Тимохов   (2004-01-21 14:33) [2]

p.ClassType.Create;



tria   (2004-01-21 14:34) [3]

Sinceramente, não sei o que é.



Тимохов   (2004-01-21 14:34) [4]

Verdade, isso também depende de como você olha Criar.



tria   (2004-01-21 14:36) [5]

Obrigado Timokhov.



Тимохов   (2004-01-21 14:36) [6]


Honestamente, não sei o que é.

Se você está falando sobre [2], use F1.



Тимохов   (2004-01-21 14:48) [7]

Para o autor
Preste atenção no Timokhov © (21.01.04 14:34) [4].
Se você for criar seu construtor Create em cada classe, torne-o virtual na classe base e substitua os descendentes.

E, em geral, estou um pouco errado:
você precisa escrever como TBaseClasses (p.ClassType) .Create, onde TBaseClasses = classe de TBaseClass. Caso contrário, o Create será chamado no TObject, e o seu create não será chamado.



pasha_golub   (2004-01-21 15:02) [8]

2Timokhov
Em princípio, o esquiador falou sobre isso.



Тимохов   (2004-01-21 15:04) [9]

pasha_golub © (21.01.04/15/02 8:XNUMX) [XNUMX]
É que Skaer tinha palavras muito inteligentes que não são compreensíveis para todos (até para mim :))))
Eu acredito que ele tinha isso em mente.



pasha_golub   (2004-01-21 15:21) [10]

2Timokhov © (21.01.04/15/04 9:XNUMX) [XNUMX]
Isso é certo. :-) É por isso que ele e o mestre.



Юрий Зотов   (2004-01-21 16:29) [11]

> tria © (21.01.04/14/29 XNUMX:XNUMX)

E se sem palavras inteligentes, e mais especificamente, então.

tipo
TBaseClass = classe
...
construtor Create (...); virual;
...
end;

TClassOfBaseClass = classe de TBaseClass;

TClass1 = classe (TBaseClass)
...
end;

TClass2 = classe (TBaseClass1)
...
end;

и т.д.

procedimento Proc1 ( RealBaseClass: TClassOfBaseClass);
var
p1: TBaseClass;
começar
p1: = RealBaseClass.Criar (...);
...
end;



Тимохов   (2004-01-21 16:34) [12]

Yuri Zotov © (21.01.04 16: 29) [11]

1. Ele não precisa do procedimento Proc1 (RealBaseClass: TClassOfBaseClass), mas do procedimento Proc1 (RealBaseClass: TBaseClass), que é uma coisa diferente.
2. Sobre o designer, ele não disse nada - talvez um TOBject em tempo integral. Criar é o suficiente para ele, então não há necessidade de



Юрий Зотов   (2004-01-21 16:45) [13]

> Timokhov © (21.01.04 16: 34) [12]

> que o conciliador é diferente.

Diferente. Mas o ClassType ainda não foi cancelado. E acredito que a solução para o problema de capturar um leão domesticado no deserto do Saara deve ser considerada por nós da mesma maneira que no livro em que essa tarefa foi formulada pela primeira vez.

> 2. Sobre o designer, ele não disse nada - talvez ele
> TOBject.Create em tempo integral é suficiente, então nenhum virtual

E aqui você, IMVHO, está muito, muito fundamentalmente enganado. Com um construtor estático, sempre será criado um objeto da mesma classe - declarado no próprio procedimento. TBaseClass, em geral.



Тимохов   (2004-01-21 17:03) [14]


> E aqui está você, IMVHO, muito forte e muito fundamental
> você está enganado. Com um construtor estático, ele sempre será criado
> um objeto da mesma classe - declarado
> no próprio procedimento. TBaseClass, em geral.


Talvez nós vamos verificar?

tipo
tcc1 = classe de tc1;
tc1 = classe (tobject)
procedimento show; virtual;
end;
tc2 = classe (tc1)
procedimento show; substituir;
end;

procedimento tc1.show;
começar
showmessage ("



Тимохов   (2004-01-21 17:05) [15]


Citado21.01.04 >> Timokhov © (16/34/12 XNUMX:XNUMX) [XNUMX]
>
citadoXNUMX >> que o conciliador é diferente.
>
> Diferente. Mas o ClassType ainda não foi cancelado. E acredito que a solução
> a tarefa de pegar um leão de mão no deserto do Saara deve ser nossa
> ser considerado da mesma maneira que no livro em que esta tarefa
> foi formulado pela primeira vez.


Também é difícil concordar com isso. O problema é que existe um objeto, você precisa torná-lo um clone da mesma classe.

Todos estão certos, mas o autor perguntou diferente.



Тимохов   (2004-01-21 17:21) [16]

Yuri Zotov!
Responda a [14]. Talvez eu entenda algo errado? Eu sou honestamente interessante ...



Юрий Зотов   (2004-01-21 17:29) [17]

> Timokhov © (21.01.04 17: 21) [16]

Por que não entender isso? Depende da implementação. Se você usar uma metaclasse, sim, e se não, com o construtor estático a mesma classe sempre será criada.



Тимохов   (2004-01-21 17:38) [18]

Algo não está muito claro.

Um exemplo foi dado em 14, o que parece contradizer a sua objeção de 13 à minha frase "Sobre o construtor, ele não disse nada - talvez um TOBject.Create em tempo integral seja suficiente para ele, e o virtual não será necessário". Você disse que estou fundamentalmente errado, talvez ainda não esteja fundamentalmente e não estou enganado? :)))

De acordo com isso, o autor da pergunta na implementação proposta em uma das primeiras respostas não precisa fazer virtual para os designers.

Sim, em geral, não é necessário fazer virtual no seu exemplo de 11 - ele funcionará corretamente sem ele.



Skier   (2004-01-21 17:40) [19]

> Timokhov © (21.01.04 17: 38) [18]
E você verifica sem virtual ... através de ClassName ...



Тимохов   (2004-01-21 17:44) [20]

Esquiador © (21.01.04 17: 40) [19]
Все работает

Eu cheirei o que é isso e qual é o nosso mal-entendido.
Se cada descendente de classe de BaseClass precisar de seu próprio construtor, será necessário escrever em TBaseClass.crate; virtual; Se todos os descendentes puderem contornar o construtor TBaseClass.crate, o virtual não será necessário.



Тимохов   (2004-01-21 17:45) [21]

T.O. tudo depende da tarefa original ...



Skier   (2004-01-21 17:48) [22]


> T.O. tudo depende da tarefa original ...

tudo depende do que entra na referência de classe.



Тимохов   (2004-01-21 17:49) [23]


> tudo depende do que entra na referência da classe.

Nota não entendida: (((



Skier   (2004-01-21 17:50) [24]


> Nota não entendida: (((

Uma pena ...



Тимохов   (2004-01-21 17:52) [25]

Esquiador © (21.01.04 17: 50) [24]
Já é um atropelamento ...: (((
Em tudo o que eu disse, infelizmente, para alguns, estou certo.



tria   (2004-01-21 18:18) [26]

> Esquiador
Posso repetir a observação com mais detalhes? E então eu vivo com isso, e realmente dói descobrir isso?



tria   (2004-01-21 18:24) [27]

O exemplo que Timokhov citou funciona, ClassName retorna tc2. Infelizmente, não vejo armadilhas.
Eu ainda tenho um construtor para todas as classes, mas no futuro poderá e será diferente. Verificado - o construtor da classe desejada é chamado.



Тимохов   (2004-01-21 18:26) [28]

tria © (21.01.04/18/24 27:XNUMX) [XNUMX]
Se você precisar de construtores diferentes (ou seja, um descendente precisa de seu próprio construtor), ouça Yuri Zotov. Prichi no construtor TBaseClass Create; virtual e crie objetos como TBaseClasses (p.ClassType).



tria   (2004-01-21 18:30) [29]

Timokhov
Eu entendi.
Verificado - ele pegou seu código, adicionou um construtor à diretiva virtual e o bloqueou no sucessor. Ao criar, o construtor da classe tc2 foi chamado. Então, na minha opinião, seu código está funcionando.



Тимохов   (2004-01-21 18:38) [30]

Todos os pensamentos expressos aqui estão funcionando - tudo depende da sua necessidade.

Do ponto de vista metodológico, o mais correto (no sentido correto) é Yuri Zotov - sempre escreva para o construtor virtual e tudo ficará sempre bem.



Тимохов   (2004-01-21 18:55) [31]


> Verificado - levou seu código, adicionou um construtor com uma diretiva
> virtual, bloqueado no sucessor. Ao criar, o construtor foi chamado
> classe tc2. Então, na minha opinião, seu código está funcionando.

Quero acrescentar a isso que o fato de criar um objeto de uma determinada classe e o fato de chamar o construtor dessa classe não são a mesma coisa.
I.e. um objeto de classe pode ser criado, mas seu construtor não é chamado. Ao mesmo tempo, não haverá erros além de ignorar uma chamada para o construtor desejado.

Você pode ver isso como um exemplo

tipo
tcc1 = classe de tc1;
tc1 = classe (tobject)
construtor create ();
end;
tc2 = classe (tc1)
construtor create ();
end;

construtor tc1.create ();
começar
showmessage ("construtor tc1, nome da classe =" + nome da classe);
end;

construtor tc2.create ();
começar
showmessage ("construtor tc2, nome da classe =" + nome da classe);
end;

procedimento p (o: tcc1);
var
oo: tc1;
começar
oo: = o.criar ();
end;

procedimento TForm1.Button10Click (Sender: TObject);
começar
p (tc1); // classe criada Tc1 é chamada const. tc1.create.
p (tc2); // classe criada Tc2 é chamada const. tc1.create.
end;

Em geral, quero voltar ao conselho para ouvir Yuri Zotov. Repito que, do ponto de vista da metodologia para escrever programas, ele está mais certo.



tria   (2004-01-21 19:07) [32]

De fato, o último exemplo é a solução mais simples para o problema ...



Тимохов   (2004-01-21 19:13) [33]


> De fato, o último exemplo é a solução mais simples
> tarefas ...

Você quis dizer o exemplo de [31]?
Ainda escreva melhor :) virtual :))) A vida será mais calma ...



tria   (2004-01-21 19:19) [34]

Ok, para brincar ...
Vou resumir para mim mesmo: não percebi toda a profundidade do problema, mas entendi como resolver meu problema e quais consequências essa ou aquela solução pode levar.
Mais uma vez obrigado a todos, estou fugindo para um passatempo muito agradável - jogando futebol.



Страницы: 1 filial inteira

Fórum: "Principal";
Arquivo atual: 2004.02.02;
Download: [xml.tar.bz2];

em cima





Memória: 0.67 MB
Hora: 0.039 c
1-2063
LordBTR
2004-01-20 12:11
2004.02.02
Streams. Por que o código não funciona?


1-2225
Opryshok
2004-01-20 11:35
2004.02.02
Ihtmldocumen2


1-2128
Zheks
2004-01-19 16:27
2004.02.02
como identificar que o número não é real?


3-2047
Evyshka
2004-01-05 16:50
2004.02.02
Связь кнопки с гридом


14-2376
Undert
2004-01-07 17:16
2004.02.02
Talvez uma pergunta muito lenta - o telhado já está indo





afrikaans albanês Arabic armênio azerbaijano basco belarusian Bulgarian catalão Chinês simplificado) Chinês tradicional) croata checo dinamarquês Dutch Inglês estoniano filipino Finnish French
Galego georgiano German grego crioulo haitiano hebraico hindi húngaro islandês Indonesian irlandês Italian Japanese Korean letão lituano macedónio Malay maltês Norwegian
persa polonês Portuguese Romeno Russa sérvio Slovak esloveno Espanhol swahili sueco tailandês turco ucraniano urdu vietnamita galês ídiche bengali bósnio
cebuano esperanto gujarati hausa hmong igbo javanês kannada khmer lao latino maori marata mongol Nepali punjabi somali tâmil telugu yoruba
zulu
Английский francês Alemão Italiano Португальский russo Espanhol