Skip to content

Instantly share code, notes, and snippets.

@mauroc8
Created July 30, 2022 02:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mauroc8/743f3fb9d79231467b25b95eb4e98c08 to your computer and use it in GitHub Desktop.
Save mauroc8/743f3fb9d79231467b25b95eb4e98c08 to your computer and use it in GitHub Desktop.
Cuadrados, rectángulos y OOP
class Square {
  public static double width;
}

class Rectangle extends Square {
  public static double height;
}

Desde el punto de vista geométrico, un cuadrado es un rectángulo pero no al revés. Si la herencia expresa una relación ontológica, Square hereda de Rectangle.

Desde el punto de vista de la API tiene sentido:

  1. Una función que recibe Rectangle acepta también Square.
  2. Una función que recibe Square no acepta un Rectangle.

Desde el punto de vista de la implementación:

  1. El Square tiene width y height porque los hereda de Rectangle, pero es redundante y fuente de bugs.
  2. No hay que escribir implementaciones distintas para calcular el área del rectángulo.

Pero desde el punto de vista de los tipos de datos el rectángulo es un sub-tipo del cuadrado. También se puede decir que el tipo Rectangle es "menor o igual" a Square.

Es menor porque todos los Rectangle son Square porque podemos ignorar el height, pero no todos los Square son Rectangle.

Por eso también tiene sentido que Rectangle extends Square. El extends expresa esa relación de "menor o igual" entre tipos.

Las consecuencias en la API serían:

  1. Una función que recibe Rectangle no puede aceptar un Square, pero es fácil convertir un Square a un Rectangle.
  2. Una función que recibe un Square puede aceptar un Rectangle y usar su ancho ignorando su alto. Esto es un poco confuso.

En este ejemplo no vale la pena usar herencia. Si fueran clases separadas, evitamos el problema (2).

Las consecuencias en la implementación son:

  1. El square se expresa sin redundancia, eliminando la posibilidad de toda una familia de bugs.
  2. Hay que escribir funciones distintas para calcular el área de un Square y de un Rectangle, aunque también se puede tener solo la función para Rectangle ya que es fácil convertir un Square a un Rectangle.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment