Modo de método de plantilla: los números de las preguntas se han copiado incorrectamente

  Definición del modo TemplateMethod (TemplateMethod): define el esqueleto de un algoritmo en funcionamiento, retrasa algunos pasos a las subclases. El método de plantilla permite que las subclases redefinan ciertos pasos específicos de un algoritmo sin cambiar la estructura del algoritmo.

  ventaja:

  • Algunos detalles de la implementación de la subclase del algoritmo son útiles para la expansión del algoritmo.
  • La operación realizada llamando a una subclase por una clase padre y agregando nuevos comportamientos por extensión de subclase, se ajusta al "principio abierto-cerrado".
  • La reutilización del código está bien realizada, el comportamiento sin cambios se coloca en la superclase y se elimina la duplicación de subclases.
    Desventajas:
  • Cada implementación diferente necesita definir una subclase, lo que conducirá a un aumento en el número de clases y un diseño más abstracto.

  Escena aplicable:

  • En algunos tipos de algoritmos, se utiliza el mismo método, lo que provoca la duplicación de código.
  • Para controlar la extensión de las subclases, las subclases deben cumplir con las reglas del algoritmo.

  Antecedentes del ejemplo: El tutor quiere dar a dos estudiantes el mismo conjunto de preguntas. Los dos estudiantes son demasiado estúpidos para distinguir el orden de las preguntas. No hay forma de que el maestro solicite otra prueba y pida a los estudiantes que escriban el pregunta (número de pregunta) primero.

Categoría de examen:

class TestPaper		//给出了逻辑骨架,具体实现留到了子类中
    {
    
    
        public void TestQuestion1()
        {
    
    
            Console.WriteLine("考题1的答案是[ ]a. b. c. d.");
            Console.WriteLine("答案:"+Answer1());
        }
        public void TestQuestion2()
        {
    
    
            Console.WriteLine("考题2的答案是[ ]a. b. c. d.");
            Console.WriteLine("答案:" + Answer2());
        }
        public void TestQuestion3()
        {
    
    
            Console.WriteLine("考题3的答案是[ ]a. b. c. d.");
            Console.WriteLine("答案:" + Answer3());
        }

		//逻辑的组成是一些抽象的操作,虚方法为了让子类重写自己的答案
        protected virtual string Answer1()
        {
    
       
            return "";
        }
        protected virtual string Answer2()
        {
    
    
            return "";
        }
        protected virtual string Answer3()
        {
    
    
            return "";
        }
    }

Prueba del alumno A:

    class TestPaperA:TestPaper		//同学甲、乙可以有不同的实现方法
    {
    
    
        protected override string Answer1()
        {
    
    
            return "b";
        }
        protected override string Answer2()
        {
    
    
            return "c";
        }
        protected override string Answer3()
        {
    
    
            return "a";
        }
    }

Prueba del alumno B:

    class TestPaperB : TestPaper
    {
    
    
        protected override string Answer1()
        {
    
    
            return "b";
        }
        protected override string Answer2()
        {
    
    
            return "c";
        }
        protected override string Answer3()
        {
    
    
            return "b";
        }
    }

Cliente:

        static void Main(string[] args)
        {
    
    
            Console.WriteLine("学生甲的试卷");
            //这里使用多态,将子类对象转成父类对象,方便使用父类的方法,实现了代码复用
            TestPaper studentA = new TestPaperA();
            studentA.TestQuestion1();
            studentA.TestQuestion2();
            studentA.TestQuestion3();

            Console.WriteLine("学生乙的试卷");
            TestPaper studentB = new TestPaperB();
            studentB.TestQuestion1();
            studentB.TestQuestion2();
            studentB.TestQuestion3();

            Console.ReadLine();
        }

Supongo que te gusta

Origin blog.csdn.net/CharmaineXia/article/details/110678481
Recomendado
Clasificación