En el código del sistema original de la compañía, vi muchos códigos que distinguen los atributos de nombre de clase de los objetos discriminatorios se procesan por separado. Y parece ser la forma estándar de lidiar con problemas similares. Pero puede haber algunos problemas.
En primer lugar, sabemos que el polimorfismo es una de las tres características principales de los objetos orientados. El llamado polimorfismo es que para diferentes tipos concretos, podemos acceder a ellos a través de la misma interfaz abstracta sin tener que relacionarse con los detalles de implementación de los tipos concretos. Al igual que emitir un aviso: todos los empleados se reúnen en la plaza de las personas a las 9 en punto de mañana. No es necesario notificar específicamente a cada persona que vive en una ubicación diferente sobre qué tiempo establecer y qué ruta tomar, porque esta es responsabilidad de la persona específica, no la responsabilidad de la persona que notifica al emisor. Por lo tanto, al escribir para determinar que ClassName debe procesarse por separado, la primera forma de pensar es agregar una interfaz a la clase principal y completarla a través de la anulación de subclase. Cambie el tamaño de la figura de la siguiente manera:
para i: = 0 a la lista gráfica.
Comenzar
Gráficos: = lista gráfica [i];
if graphic.classname = 'rectangle' entonces
Comenzar
Rectángulo (gráfico) .length: = rectangle (gráfico) .length* 2;
Rectángulo (gráfico) .Width: = rectangle (gráfico) .Width* 2;
fin
más si gráfico.classname = 'círculo' entonces
Comenzar
Círculo (gráfico).
fin
fin;
Puede agregar el método "ChangeSize" a los gráficos de la clase principal ", el código es el siguiente
Gráficos = clase
...
Procedimiento cambia (tasa: entero);
fin;
rectángulo = clase
...
procedimiento cambia (tasa: entero);
fin;
Círculo = clase
...
procedimiento cambia (tasa: entero);
fin;
Código para implementar cambios de tamaño en clases de gráficos específicas:
procedimiento rectangle.ChangeSize (tasa: entero);
Comenzar
largo: = tarifa larga*;
Ancho: = ancho* tasa;
fin;
procedimiento Circular.ChangeSize (tasa: entero);
Comenzar
Radio: = Radio* tasa;
fin;
Después de modificar de esta manera, el código anterior se puede llamar así:
para i: = 0 a la lista gráfica.
Comenzar
Gráficos: = lista gráfica [i];
Graphics.ChangeSize (2);
fin;
Esto deja el código más claro.
Por supuesto, en muchos casos, la solución anterior no se puede usar al juzgar el nombre de clase. Por ejemplo, iterar sobre los cotrols de Forma y realizar pruebas iniciales en diferentes controles. Es imposible para nosotros agregar métodos de inicialización al TControl, solo podemos usar para distinguir tipos de subclase específicos. Luego, en este momento, recomiendo usar el operador IS en lugar de comparar directamente ClassName.
El uso de IS, la declaración AObject es el resultado de TFORM en diferentes tipos de Aobject:
Aobject es Tobject, y el resultado es falso;
Aobject es tForm, y el resultado es verdadero;
Aobject es tForm1, y el resultado es verdadero;
Aobject es tedit, y el resultado es falso;
Aobject es nulo, y el resultado es falso;
A partir del ejemplo anterior, podemos ver una ventaja de usar IS. En el futuro, se puede usar TCoolEdit para embellecer la interfaz, por lo que este código no es necesario cambiar, porque un TCooledit es un TEDIT;
En segundo lugar, si el objeto juzgado puede estar vacío, use ClassName para determinar si el objeto se asigna primero, de lo contrario se producirá un error de acceso de memoria. El representante del juicio debe escribirse como: si se asigna (aObject) y aObject.className = 'tcLass1';
La última razón por la que ClassName no se usa como un juicio es que ClassName solo se usa para describir las propiedades de una clase. Errores lógicos.
Si acontrol.classname = 'teidt' entonces // este código solo se verificará si nota que la edición no se prueba inicialmente;
Si el acontrol es teidt, // no se puede compilar y pasar;
Según lo anterior, cuando es necesario determinar el tipo específico de un objeto, en primer lugar, debemos considerar evitar tales declaraciones de procesamiento especiales a través del procesamiento polimórfico. que el nombre de clase.
En un caso muy especial, es posible que no obtenga el resultado deseado, como si Tedit y TCooledit deben manejarse por separado. que será mejor que ninguna.
Acooledit es tedit // verdadero;
acooledit.classtype = tedit // false;
acooledit.classtype = tCooledit // true;