2012-06-27 17 views
5

GenteCómo extender una clase sellada - necesita explicación y uso simple del programa en tiempo real

Tengo una clase sellada de la siguiente manera. Quiero extender esta clase sellada para agregar un método que devolverá un promedio de x e y. Esto no es sólo método de extensión usando "este" :(Podría alguien por favor me ayude a entender el concepto de "Ampliación de clase cerrada" y su "tiempo de uso real y los beneficios"

class Sealed A  
{ 
    int a; int b;  
    int Add (int x, int y)  
    { 
     return x+y; 
    } 
} 

Gracias ....

+2

Stack Overflow no es un sustituto de un libro o tutorial. Y, es decir, todo el punto * sellado * es que no puedes extenderlo. –

+0

¿no es esto un oxímoron? – Didaxis

+0

@AnthonyPegram - ¿Sobrevivir sin WSOIN? – Oded

Respuesta

13

Como @ReedCopsey ya ha señalado, la forma de ampliar la funcionalidad de una clase sellada es con un Extension Method. Aquí está uno que va a hacer lo que están pidiendo:

public sealed class MyClass  
{ 
    int a; int b;  
    int Add (int x, int y)  
    { 
     return x + y; 
    } 
} 

public static class MyClassExtensions 
{ 
    public static decimal Average(this MyClass value, int x, int y) 
    { 
     return (x + y)/2M; 
    } 
} 

Uso:

var myClass = new MyClass(); 

    // returns 15 
    var avg = myClass.Average(10, 20); 

EDITAR a lo solicitado, aquí es el todo el código. Cree una nueva aplicación de consola en Visual Studio, reemplace todo el código en el archivo Program.cs con el siguiente código y ejecútelo.

using System; 

namespace ConsoleApplication1 
{ 
    public sealed class MyClass 
    { 
     public int X { get; private set; } 
     public int Y { get; private set; } 

     public MyClass(int x, int y) 
     { 
      this.X = x; 
      this.Y = y; 
     } 

     int Add() 
     { 
      return this.X + this.Y; 
     } 
    } 

    public static class MyClassExtensions 
    { 
     public static decimal Average(this MyClass value) 
     { 
      return (value.X + value.Y)/2M; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var myClass = new MyClass(10, 20); 
      var avg = myClass.Average(); 

      Console.WriteLine(avg); 
      Console.ReadLine(); 
     } 
    } 
} 
+1

Perfecto, esto es lo que esperaba ... .EXACTLY .... y oh, sí ahora puedo reconocer cuando escribí Average (este int x ... interviewer me detuvo y me dijo que esta es una clase sellada y que puedes usar de esta manera ..... Así que ahora tengo que saber de tu publicación cómo crear el método de extensión en la clase sellada ..... entonces es diferente de crear el método de extensión en la clase normal? Si tengo que ver la misma clase que la clase normal y no sellada, ¿cómo será la implementación de la misma? ? Muchas gracias, tu respuesta me hizo entender mejor ... :) – Learner

+0

No, no es diferente de crear un método de extensión para una clase normal (no sellada) .Es exactamente lo mismo. –

+0

Gracias Kevin ... Eso fue realmente muy útil :) Lo agradezco :) Saludos – Learner

7

Podría alguien por favor me ayude a entender el concepto de "Ampliación de clase cerrada" y su "tiempo de uso real y los beneficios"

el concepto básico es que una clase sellada significa que no puede subclase (extender) de ella. Esta es la razón por la cual la clase es sellado - esto "sella" la clase por lo que no se puede extender.

Los métodos de extensión le permiten hacer un método que aparece en para extender la clase, pero es realmente un método estático normal. El compilador llama a este método y pasa la instancia de la clase.

+0

Muchas gracias Reed, ahora tengo los ojos abiertos ... Estaba en blanco cuando me preguntaron en una entrevista ... Estaba intentando confundirme en la entrevista :( – Learner

Cuestiones relacionadas