2012-08-15 17 views
5

El modelo de plantilla modelo establece que la clase base abstracta tiene un método no invalidable: este método implementa el algoritmo común y no debe anularse en las subclases. En Java, el método de la plantilla se declara final dentro de la clase base abstracta, en C# la palabra clave sealed tiene un significado similar, pero no se puede declarar un método no reemplazado sealed.Implementación del patrón Método de plantilla en C#

public abstract class Base 
{ 
    protected abstract AlgorithmStep1(); 

    protected abstract AlgorithmStep2(); 

    public sealed void TemplateMethod() // sealed: compile error 
    { 
     AlgorithmStep1(); 
     AlgorithmStep2(); 
    } 
} 

¿Cómo puedo resolver este problema? ¿Por qué no se puede evitar que un método pueda ser anulado por subclases (en C#)?

+2

Solo puede sellar miembros anulados. La falta de la palabra clave 'abstract' o' virtual' significa que el método ya está sellado. – ChaosPandion

Respuesta

7

El modificador sealed solo es válido para los miembros de la función que están anulando los miembros de la clase base, para evitar que sean virtuales para las clases derivadas. Los miembros de la función no son virtuales por defecto en C# (a diferencia de Java). Aún necesita el modificador sealed para una clase - las clases no están selladas por defecto.

Simplemente elimine el modificador sealed de su método y debería estar bien.

Consulte la sección 10.6.5 de la especificación C# 4 para obtener más información sobre los métodos sellados (las propiedades selladas y los eventos se encuentran en las secciones 10.7.5 y 10.8.4, respectivamente).

Cuando una declaración de método de instancia incluye un modificador sealed, se dice que ese método es un método sellado. Si una declaración de método de instancia incluye el modificador sealed, también debe incluir el modificador override. El uso del modificador sealed impide que una clase derivada anule aún más el método.

+0

Ok, funciona correctamente eliminando la palabra clave 'sealed', pero pensé que había algún mecanismo (como la palabra clave' final' en Java) que evita que se oculte el método heredado_. Me pregunto, por curiosidad, la razón por la cual este mecanismo no está presente. – enzom83

+2

@ enzom83: No, siempre puedes * ocultar * el método heredado, pero no puedes anularlo, por lo que cualquiera que llame a 'TemplateMethod' en una expresión de tipo estático' Base' siempre llamará al método correcto. –

1

Simplemente elimine la palabra clave sealed. Por defecto, los métodos no son reemplazables; las subclases no pueden anularlas, solo ocultarlas.

1

Los métodos C# están sellados por defecto

Cuestiones relacionadas