AS3: ¿cuándo implementar o ampliar?

Tomemos, por ejemplo, un juego de preguntas de opción múltiple.

Tiene clases MathQuestion y WordQuestion, ¿deberían implementar una interfaz IQuestion, que defina funciones de pregunta, respuesta y dificultad, O es más habitual extender una clase base de preguntas y anular estas funciones?

¿Cuál es la forma más correcta de hacer esas cosas?

preguntado el 16 de mayo de 11 a las 16:05

2 Respuestas

Aquí hay otra forma de pensar sobre el problema: ¿hay realmente alguna diferencia entre una MathQuestion y una WordQuestion? Para mí, parece que ambos son objetos Pregunta y podría diferenciar entre los diferentes tipos a través de composición.

Podrías empezar por definir un Enumerar class que enumera los diferentes tipos de preguntas que aparecen en su prueba (estrictamente hablando, ActionScript 3 no tiene las enumeraciones adecuadas, pero aún podemos lograr la seguridad de tipos con el siguiente código).

public class QuestionType {
    public static const MATH : QuestionType = new QuestionType("math");
    public static const WORLD : QuestionType = new QuestionType("world");

    private var _name : String;

    // Private constructor, do no instantiate new instances.
    public function QuestionType(name : String) {
        _name = name;
    }

    public function toString() : String {
        return _name;
    }
} 

A continuación, puede pasar una de las constantes de QuestionType a la clase de preguntas cuando la construya:

public class Question {
    private var _message : String /* Which country is Paris the capital of? */
    private var _answers : Vector.<Answer>; /* List of possible Answer objects */
    private var _correctAnswer : Answer; /* The expected Answer */
    private var _type : QuestionType; /* What type of question is this? */

    public function Question(message : String, 
                              answers : Vector.<Answer>, 
                              correctAnswer : Answer, 
                              type : QuestionType) {
        _message = message;
        _answers = answers.concat(); // defensive copy to avoid modification.
        _correctAnswer = correctAnswer;
        _type = type;
    }

    public function getType() : QuestionType {
        return _type;
    }
}

Finalmente, un cliente (el código que hace uso del objeto Pregunta) puede consultar el tipo de pregunta fácilmente:

public class QuizView extends Sprite {
    public function displayQuestion(question : Question) : void {
        // Change the background to reflect the QuestionType.
        switch(question.type) {
            case QuestionType.WORLD:
                _backgroundClip.gotoAndStop("world_background");
                break;

            case QuestionType.MATH:
                _backgroundClip.gotoAndStop("math_background");
                break;
        }
    }
}

contestado el 23 de mayo de 17 a las 15:05

Vaya, gracias por un gran consejo. Aunque creo que, por lo que tengo en mente, los objetos de pregunta serían bastante diferentes, Math generaría varios cálculos, mientras que Word consultaría una base de datos. - davivid

Depende principalmente de los detalles exactos de sus clases. Si la funcionalidad de las clases es radicalmente diferente pero comparten nombres de función / propiedad, entonces una interfaz sería más apropiada. Si las clases comparten una gran cantidad de implementación común, entonces sería más apropiado crear una subclase.

De su descripción, las dos clases parecen encajar más en la categoría de "misma función / propiedades" con diferentes implementaciones y probablemente estarían mejor con una interfaz.

Por lo general, uso interfaces para imponer un comportamiento común que comparte un grupo de clases, mientras que la subclasificación se usa de manera más apropiada en los casos en que puede lograr una reutilización seria del código a través de funciones / propiedades heredadas. Al final del día, es principalmente una elección de diseño.

contestado el 16 de mayo de 11 a las 20:05

Bien, eso era lo que estaba pensando, las clases necesitan preguntas y respuestas, pero la clase de matemáticas generaría cálculos mientras que la clase de Word estaría consultando una base de datos. - davivid

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.