No código do sistema original da empresa, vi muitos códigos que distinguem os atributos do nome da classe dos objetos discriminatórios são processados separadamente. E parece ser a maneira padrão de lidar com problemas semelhantes. Mas pode haver alguns problemas.
Primeiro de tudo, sabemos que o polimorfismo é uma das três principais características da orientação de objetos. O chamado polimorfismo é que, para diferentes tipos de concreto, podemos acessá-los através da mesma interface abstrata sem precisar se relacionar com os detalhes da implementação dos tipos de concreto. Assim como emitir um aviso: todos os funcionários se reúnem na Praça Popular às 9 horas amanhã. Não é necessário notificar especificamente cada pessoa que vive em um local diferente a que horas estabelecer e qual caminho seguir, porque essa é de responsabilidade da pessoa específica, não de responsabilidade da pessoa que notifica o emissor. Portanto, ao escrever para determinar que o nome da classe precisa ser processado separadamente, a primeira maneira de pensar é adicionar uma interface à classe pai e concluí -la através da substituição da subclasse. Altere o tamanho da figura da seguinte forma:
para i: = 0 para a lista gráfica.count - 1 do
Começar
Gráficos: = lista gráfica [i];
Se graphic.className = 'retângulo', então
Começar
Retângulo (gráfico) .Length: = retângulo (gráfico) .Length* 2;
Retângulo (gráfico) .Width: = retângulo (gráfico) .Width* 2;
fim
caso contrário, se graf.classname = 'círculo' então
Começar
Círculo (gráfico).
fim
fim;
Você pode adicionar o método "alterações" aos "gráficos" da classe pai, o código é o seguinte
Graphics = classe
...
Procedimento alterações (taxa: número inteiro);
fim;
retângulo = classe
...
Procedimento alterações (taxa: número inteiro);
fim;
Círculo = classe
...
Procedimento alterações (taxa: número inteiro);
fim;
Código para implementar alterações de tamanho em classes gráficas específicas:
procedimento retângulo.Changesize (taxa: número inteiro);
Começar
long: = long* taxa;
Largura: = largura* taxa;
fim;
Procedimento circular.Changesize (taxa: número inteiro);
Começar
Raio: = raio* taxa;
fim;
Depois de modificar dessa maneira, o código acima pode ser chamado assim:
para i: = 0 para a lista gráfica.count - 1 do
Começar
Gráficos: = lista gráfica [i];
Graphics.Changesize (2);
fim;
Isso torna o código mais claro.
Obviamente, em muitos casos, a solução acima não pode ser usada ao julgar ClassName. Por exemplo, itera o cotrols do formulário e conduza ensaios iniciais em diferentes controles. É impossível para nós adicionar métodos de inicialização ao TControl, só podemos usar para distinguir tipos de subclasse específicos. Então, neste momento, recomendo usar o operador IS em vez de comparar diretamente o ClassName.
O uso de SI, a declaração AObject é o resultado do TForm em diferentes tipos de AObject:
AObject é objeto e o resultado é falso;
AObject é tform e o resultado é verdadeiro;
AObject é TForm1 e o resultado é verdadeiro;
AObject é Tedit e o resultado é falso;
AObject é nulo, e o resultado é falso;
A partir do exemplo acima, podemos ver uma vantagem do uso do IS. No futuro, o TCOOLEDIT pode ser usado para embelezar a interface; portanto, esse código não precisa ser alterado, porque um Tcooledit é um TEDIT;
Em segundo lugar, se o objeto julgado pode estar vazio, use o ClassName para determinar se o objeto é atribuído primeiro, caso contrário, ocorrerá um erro de acesso à memória. O representante do julgamento deve ser escrito como: se atribuído (aobject) e aObject.className = 'tclass1';
A última razão pela qual a ClassName não é usada como julgamento é que o ClassName é usado apenas para descrever as propriedades de uma comparação de strings. erros lógicos.
Se acontrol.className = 'teidt', então // Este código será verificado apenas se você notar que a edição não será testada inicialmente;
Se o acontrol for teidt, então // não poderá ser compilado e passado;
Com base no exposto, quando é necessário determinar o tipo específico de um objeto, antes de tudo, devemos considerar evitar declarações de processamento especiais através do processamento polimórfico. do que ClassName.
Em um caso muito especial, o IS não pode obter o resultado desejado, como se o TEDIT e o TCOOLEDIT precisarem ser tratados separadamente. que será melhor do que nenhum.
ACOOLEDIT é TEDIT // true;
ACOOLEDIT.CLASSTYPE = TEDIT // false;
ACOOLEDIT.CLASSTYPE = TCOOLEDIT // true;