2010-11-11 20 views
26

Soy un novato en C#. Estoy leyendo acerca de la palabra clave Sellada.Tengo sobre clase sellada.He leído una línea sobre el método Sellado donde también podemos hacer el método Sellado.La línea era (By declarando el método como sellado, podemos evitar más anulación de este método.) He creado una demostración pero no entendí que el significado de la línea anterior y el uso del método sellado. A continuación se muestra el código: -Método sellado en C#

using System; 

namespace ConsoleApplication2 
{ 
    class Program:MyClass 
    { 
     public override sealed void Test() 
     { 
      Console.WriteLine("My class Program"); 
     } 
     static void Main(string[] args) 
     { 
      Program obj = new Program(); 
      obj.Test(); 
      Console.ReadLine(); 
     } 
    } 

    class MyClass 
    { 
     public virtual void Test() 
     { 
      Console.WriteLine("My class Test"); 
     } 
    } 


} 

Por favor, dime por qué utilizamos métodos selladas y cuáles son las ventajas de los métodos de sellado.

Respuesta

48

Bueno, estás probando con solo dos niveles de herencia, y no estás llegando al punto en que "anulas más" un método . Si lo haces tres, se puede ver lo que hace sealed:

class Base { 
    public virtual void Test() { ... } 
} 
class Subclass1 : Base { 
    public sealed override void Test() { ... } 
} 
class Subclass2 : Subclass1 { 
    public override void Test() { ... } // Does not compile! 
    // If `Subclass1.Test` was not sealed, it would've compiled correctly. 
} 
+0

Gracias Mehrdad .. :) –

+0

¿Puedo hacer esto con el primer nivel siendo una interfaz? –

-3

C# lo tiene porque Java tiene una característica idéntica (métodos final). Nunca he visto un uso legítimo.

Si no desea permitir la extensión, toda la clase debe marcarse sealed y no solo un método.

+6

C# tiene porque Java tiene que? No lo creo. Una explicación más probable es que C# y Java tienen ambas características porque es una característica útil. –

+2

@Eric: Ahora, por supuesto, si estuviéramos hablando de covarianza de matriz, sería una cuestión diferente;) –

+0

@Jon: de hecho, aunque, por supuesto, la cadena de decisiones de diseño es un poco menos directa. Yo diría que el sistema de tipo CLR tiene esa característica porque el lenguaje Java lo hace, y C# tiene esa característica porque el sistema de tipo CLR lo tiene. –

18

Bueno, solo utilizaría "sellado" en un método si no desea que las clases derivadas anulen aún más su método. Los métodos están sellados por defecto, si no se declaran como virtuales y no anulan otro método virtual. (En Java, los métodos son virtuales por defecto: para lograr un comportamiento "predeterminado" de C#, debe marcar un método como final).

Personalmente, me gusta controlar la herencia con cuidado: prefiero que las clases completas estén selladas cuando sea posible. Sin embargo, en algunos casos, aún desea permitir la herencia, pero asegúrese de que algunos métodos no se anulan aún más. Un uso podría ser efectivamente template the method, p. para el diagnóstico:

public sealed override void Foo(int x) 
{ 
    Log("Foo called with argument: {0}", x); 
    FooImpl(x); 
    Log("Foo completed"); 
} 

protected abstract void FooImpl(int x); 

Ahora subclases no puede anular directamente Foo - tendrían que anular FooImpl, por lo que nuestro comportamiento será siempre se ejecutará cuando otro código llama Foo.

La creación de plantillas podría ser por otros motivos, por ejemplo, para aplicar ciertos aspectos de la validación de argumentos.

En mi experiencia, los métodos sellados no se usan con demasiada frecuencia, pero me alegra que la capacidad esté ahí. (Solo desearía que las clases estuvieran selladas por defecto, pero esa es otra conversación.)

58

Un sellado clase es una clase que no puede ser una clase base de otra clase más derivada.

Un método sellado en una clase no sellada es un método que no se puede anular en una clase derivada de esta clase.

¿Por qué utilizamos métodos sellados? ¿Cuáles son las ventajas de los métodos sellados?

Bueno, ¿por qué usas los métodos virtuales? Para proporcionar un punto en el que se puede personalizar el comportamiento de una clase.Entonces, ¿por qué usas métodos sellados? Para proporcionar un punto en el que tenga garantizado que no se producirán más cambios en el comportamiento de ninguna clase derivada con respecto a este método.

puntos donde el comportamiento de una clase puede ser personalizado son útiles pero peligroso. Son útiles porque permiten que las clases derivadas cambien el comportamiento de la clase base. Son peligrosos ... espere ... porque habilitan las clases derivadas para cambiar el comportamiento de la clase base. Los métodos virtuales básicamente permiten a terceros hacer que sus clases hagan locos cosas que nunca anticipó o probó.

Me gusta escribir código que hace lo que preveo y lo que probé. El sellado de un método le permite continuar permitiendo que las partes de la clase se anulen mientras que los métodos sellados tienen un comportamiento garantizado, comprobable y estable que no se puede personalizar aún más.

+0

Gracias Eric .. :) –

+0

+1 Gracias, gran respuesta. – Sabuncu

+0

Gracias @Eric. Explicación fácil y detallada. – Slan

1

Ahora, si declara una subclase de Programa, no podrá anular el método de Prueba, ese es el punto.

En la mayoría de los casos, no necesitará métodos sellados, pero pueden resultar útiles cuando está desarrollando una clase base para algún sistema de complementos que los desarrolladores de terceros deben ampliar para crear su propio complemento. Puede conservar algunos datos de servicio, como el nombre del complemento y si está habilitado, y usar métodos y propiedades sellados para hacerlo, de modo que los desarrolladores de complementos no lo arruinen. Eso es un caso cuando los miembros sellados venir a mano

1

Métodos selladas

método de sellado se utiliza para definir el nivel primordial de un método virtual.

La palabra clave sellada siempre se utiliza con la palabra clave anular.

Demostración práctica del método de sellado

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace sealed_method 
{ 
    class Program 
    { 
     public class BaseClass 
     { 

      public virtual void Display() 
      { 
       Console.WriteLine("Virtual method"); 
      } 
     } 

     public class DerivedClass : BaseClass 
     { 
      // Now the display method have been sealed and can;t be overridden 
      public override sealed void Display() 
      { 
       Console.WriteLine("Sealed method"); 
      } 
     } 

     //public class ThirdClass : DerivedClass 
     //{ 

     // public override void Display() 
     // { 
     //  Console.WriteLine("Here we try again to override display method which is not possible and will give error"); 
     // } 
     //} 

     static void Main(string[] args) 
     { 

      DerivedClass ob1 = new DerivedClass(); 
      ob1.Display(); 

      Console.ReadLine(); 
     } 
    } 
}