¿Hay algún experto que pueda decirme "cuáles son las características de comportamiento de un objeto" y cuáles son las características de comportamiento de un objeto?
Acabo de copiar algunos párrafos de CSDN para que los leas:
Por ejemplo, perro es una clase base, y los perros dálmatas y labradores son clases heredadas.
Los perros tienen un atributo de edad, y los dálmatas y labradores también heredan el atributo de edad.
La clase de perro tiene un método de ladrar, y tanto los dálmatas como los labradores también heredan este método de ladrar.
No importa qué tipo de perro sea, tiene una edad y ladra, que son las mismas características de comportamiento de la clase de herencia canina.
: "Si la subclase hereda la clase principal, entonces los métodos (comportamientos) de la clase principal también deberían tener los métodos (comportamientos) de la subclase. Por ejemplo, "El avestruz no es un pájaro". ." ", si tomamos pájaro como clase padre y definimos un método "mosca" en la clase padre; entonces definimos un avestruz y dejamos que herede el pájaro. Sin embargo, los avestruces no pueden volar y los avestruces no tienen un padre. Método "volar" en la clase, si obligamos al avestruz a heredar el pájaro, cuando el avestruz (subclase) reemplaza al pájaro (clase principal), el código no se ejecutará normalmente, lo que viola el "principio de sustitución de Richter" ¿Sí, no? Lo entiendo de esta manera: "El principio de sustitución de Liskov significa que los objetos en el mismo sistema de herencia deben tener las mismas características de comportamiento"
Básicamente, se puede entender de esta manera. Sin embargo, los principios no pueden aplicarse rígidamente. Por ejemplo, "El avestruz es en realidad un pájaro; sólo tiene alas vestigiales". Entonces tenemos que ver si debemos ignorar temporalmente al avestruz en nuestro sistema, o cambiar la definición del pájaro (por ejemplo, juzgar directamente el caso especial de una determinada rama/interfaz en la prueba de alto nivel del pájaro).
Hay un ejemplo "famoso" de este principio utilizado incorrectamente. Primero escribió un caso de prueba sobre un rectángulo: "La longitud es 20 veces el ancho es 10 y el área es igual a 200". Luego hace que un cuadrado herede del rectángulo y, por ejemplo, el largo y el ancho del cuadrado son iguales, por lo que el área es igual a 400 o igual a 100, que no es igual a 200, por lo que el caso de prueba falla. Así que aplicó rígidamente este "principio" y llegó a la conclusión de que "¡un cuadrado no puede heredar de un rectángulo"!
De hecho, esta inferencia es insostenible. Debido a que nunca nos muestra un ejemplo de cómo se usa un cuadrado en un caso de prueba rectangular, simplemente escribe aleatoriamente "si la longitud del lado del cuadrado es 10 (o 20), afirma que el área debe ser igual a 200. Incorrecto". caso de prueba. Se puede ver que incluso los maestros cometerán errores de bajo nivel al escribir casos de prueba en casa, y aparecieron errores de bajo nivel en el trabajo conocido como "America Shocking Award".
Este tipo de caso de prueba es incorrecto. Debido a que el nuevo método de creación de instancias de un objeto no se puede heredar, no se puede escribir un nuevo código para un objeto rectangular, y al mismo tiempo obtendrá un cuadrado. Sólo podemos decir el código de nuevo un objeto cuadrado por el contrario, y obtendrá un rectángulo al mismo tiempo, eso es todo.
El llamado "llevar el objeto de la subclase al caso de prueba de la clase principal para su verificación" se refiere a un caso de prueba como este: "Supongamos que se conoce un rectángulo, con un lado de x y el otro lado de y, entonces el área es x*y". Un caso de prueba de este tipo se puede utilizar para rectángulos. Pero suponiendo que el caso de prueba contenga código nuevo para un objeto de clase principal, ¡este caso de prueba ya no se puede utilizar para subclases!
El ejemplo resultó ser muy astuto. Estableció a la fuerza dos lados de un rectángulo (10 y 20 respectivamente) en este caso de prueba para simular exactamente lo mismo que un objeto de clase padre deliberadamente nuevo. en un rectángulo en este momento provocará un error en el caso de prueba. ¿Vamos a decir "el cuadrado no debe heredar del rectángulo"? De hecho, simplemente cambie su caso de prueba en este momento. que los principios son solo principios. Debemos cambiar nuestros métodos de prueba sin cambiar los principios básicos. Cambiar nuestros métodos de prueba equivale a cambiar nuestra interfaz y el diseño de comportamiento.
De hecho, no es el principio el que determina el resultado. poder, pero el método basado en pruebas.
Di este ejemplo, que es muy similar al ejemplo del "avestruz" que mencionaste. Aunque no lo dijiste, en realidad lo dijiste. como el ejemplo del maestro, ¡solo para engañarme!
Si solo queremos detenernos en este principio, podemos encontrar muchos ejemplos "astutos".
Sin embargo, nuestro principio más importante en este momento es "natural", que se basa en el principio de que la gente común (personas inteligentes que no entienden la programación de software) puede entenderlo, en lugar de basarse simplemente en la teoría del diseño de programación. Si hacemos algunas modificaciones al caso de prueba con menos esfuerzo, por ejemplo, si establecemos un atributo bool en el rectángulo "si los dos lados pueden ser desiguales", entonces pasará. ¿Se está abusando de la herencia en este momento?
Dejemos atrás la teoría y veamos si nuestro diagrama de tipo de objeto es intuitivo y fácil de leer. Utilice este “juicio” como guía. en lugar de teoría.