You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
El otro día en clase, @ramoncorominas planteaba "¿cuando sí se cumple el principio de sustitución de Liskov?". Le puse en clase el ejempo de los múltiples decodificadoes de audio .ogg, .wav, .mp3... donde deberíamos poder sustituir uno por otro... ¡Nada más lejos de la realidad, como apuntaba Ramón! Y es cierto, planteé mal el ejemplo (para empezar porque esas clases serían hermanas, así que no hay herencia entre ellas).
Dejad que lo plantee de otra forma, saltando de lo más formal a lo más divugativo. Formalmente, el principio de sustitución dice:
What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
Me gustaría que nos fijáramos en este "What is wanted here..." que significa que podemos definit una forma de herencia o especialización (subtyping) definida por poder o no hacer esta sustitución. Tal clase de especialización se llama especialización de comportamiento (behavioral subtyping).
Este es el tipo de especialización que es deseable en un programa. Intuitivamente, porque la cosa va de reutilizar código, que suele estar en los métodos (comportamiento como decía @eun-plata cuando dió su defnición de objeto).
Esto no significa que la noción "un cuadrado es un rectángulo con los lados iguales" sea incorrecta bajo otras definiciones de especialización. Significa que para la definición de Python que hemos dado de un rectángulo:
Tan pronto como le pase a la función test_area un cuadrado, va a dejar de funcionar, pese a que la función maneja la API del rectángulo como cabe esperar.
La especialización por comportamiento permite la reutilización del código en la guisa todo o nada. Si en la clase derivada te sobran métodos, es mejor optar
por la composición:
El otro día en clase, @ramoncorominas planteaba "¿cuando sí se cumple el principio de sustitución de Liskov?". Le puse en clase el ejempo de los múltiples decodificadoes de audio
.ogg
,.wav
,.mp3
... donde deberíamos poder sustituir uno por otro... ¡Nada más lejos de la realidad, como apuntaba Ramón! Y es cierto, planteé mal el ejemplo (para empezar porque esas clases serían hermanas, así que no hay herencia entre ellas).Dejad que lo plantee de otra forma, saltando de lo más formal a lo más divugativo. Formalmente, el principio de sustitución dice:
Me gustaría que nos fijáramos en este "What is wanted here..." que significa que podemos definit una forma de herencia o especialización (subtyping) definida por poder o no hacer esta sustitución. Tal clase de especialización se llama especialización de comportamiento (behavioral subtyping).
Este es el tipo de especialización que es deseable en un programa. Intuitivamente, porque la cosa va de reutilizar código, que suele estar en los métodos (comportamiento como decía @eun-plata cuando dió su defnición de objeto).
Esto no significa que la noción "un cuadrado es un rectángulo con los lados iguales" sea incorrecta bajo otras definiciones de especialización. Significa que para la definición de Python que hemos dado de un rectángulo:
Y del cuadrado:
Tratar de ver un cuadrado como una especialización de comportamiento de un rectángulo no va a funcionar. El ejemplo venía con la prueba del test:
Tan pronto como le pase a la función
test_area
un cuadrado, va a dejar de funcionar, pese a que la función maneja la API del rectángulo como cabe esperar.La especialización por comportamiento permite la reutilización del código en la guisa todo o nada. Si en la clase derivada te sobran métodos, es mejor optar
por la composición:
@ramoncorominas, un ejemplo de "buena herencia" son aquellas clases que expanden capacidades. Por ejemplo, un rectángulo coloreado:
The text was updated successfully, but these errors were encountered: