Pregunta

¿Es una buena práctica dejar que las clases abstractas definan variables de instancia?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

La subclase, ExternalJavaScript.class, obtendría automáticamente la variable de origen, pero creo que es más fácil leer el código si todas las subclases definen el origen, en lugar de la herencia.

¿Cuál es tu consejo?

/ Adam

¿Fue útil?

Solución

Pensé que algo como esto sería mucho mejor, ya que está agregando una variable, entonces ¿por qué no restringir el acceso y hacerlo más limpio? Sus captadores / colocadores deben hacer lo que dicen en la lata.

public abstract class ExternalScript extends Script {

private String source;

public void setSource(String file) {
    source = file;
}

public String getSource() {
    return source;
}

Volviendo a la pregunta, ¿alguna vez te molestaste en mirar dónde está el código getter / setter cuando lo lees? Si todos obtienen y configuran, entonces no necesita preocuparse por lo que la función 'hace' al leer el código. Hay algunas otras razones para pensar también:

  • Si la fuente estaba protegida (tan accesible para las subclases), entonces el código se vuelve confuso: ¿quién está cambiando las variables? Cuando se trata de un objeto, se vuelve difícil cuando necesita refactorizar, mientras que un método tiende a facilitar este paso.
  • Si sus métodos getter / setter no están obteniendo y configurando, entonces descríbalos como algo más.

Siempre piensa si tu clase es realmente diferente o no, y eso debería ayudar a decidir si necesitas algo más.

Otros consejos

Claro .. ¿Por qué no?
Las clases básicas abstractas son simplemente una conveniencia para el comportamiento de la casa y los datos comunes a 2 o más clases en un solo lugar para la eficiencia de almacenamiento y mantenimiento. Es un detalle de implementación.
Sin embargo, tenga cuidado de no estar usando una clase base abstracta donde debería estar usando una interfaz. Consulte Interfaz vs clase base

Por supuesto. La idea general de las clases abstractas es que pueden contener algún comportamiento o datos que usted requiere que contengan todas las subclases. Piense en el ejemplo simple de WheeledVehicle: debería tener una variable de miembro numWheels. Desea que todas las subclases tengan esta variable. Recuerde que las clases abstractas son una característica muy útil al desarrollar API, ya que pueden garantizar que las personas que extienden su API no la rompan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top