2012-06-27 9 views
5

FolksCome estendere una classe chiusa - bisogno di spiegazione semplice e l'uso di programmi in tempo reale

Ho una classe chiusa come segue. Voglio estendere questa classe sigillata in modo da aggiungere un metodo che restituirà la media di x e y. Questo non è solo metodo di estensione con "questo" :(Qualcuno potrebbe aiutarmi a capire il concetto di "Estensione di classe Sealed" e il suo "tempo di utilizzo reale e benefici"

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

Grazie ....

+2

Stack Overflow non è un sostituto per un libro o un tutorial. E, in particolare, l'intero punto di * sealed * è che non è possibile estenderlo. –

+0

non è questo un ossimoro? – Didaxis

+0

@AnthonyPegram - Sopravvivere senza WSOIN? – Oded

risposta

13

Come già sottolineato da @ReedCopsey, il modo per estendere la funzionalità di una classe sigillata è con un Extension Method. Qui è uno che farà quello che stai chiedendo:

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; 
    } 
} 

Usage:

var myClass = new MyClass(); 

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

EDIT Come richiesto, ecco il tutto il codice. Creare una nuova applicazione console in Visual Studio, sostituire tutto il codice nel file Program.cs con il codice seguente ed eseguire.

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

Perfetto questo è quello che mi aspettavo ... ESATAMENTE .... e oh sì ora posso riconoscere quando ho scritto Media (questo int x ... l'intervistatore mi ha fermato e ha detto che questa è una classe sigillata e puoi usare in questo modo ..... Così ora ho capito dal tuo post come creare un metodo di estensione sulla classe sealed ..... quindi è diverso dal creare un metodo di estensione nella classe normale? Se devo vedere la stessa classe della classe normale e non sigillata, come sarà l'implementazione della stessa ? Grazie mille, la tua risposta mi ha fatto capire meglio ... :) – Learner

+0

No, non è diverso dal creare un metodo di estensione per una normale (non sigillata) classe.E 'esattamente la stessa cosa –

+0

Grazie Kevin .... Questo è stato davvero molto utile :) Apprezzalo :) Saluti – Learner

7

qualcuno potrebbe aiutarmi a capire il concetto di "Estensione di classe Sealed" e il suo "tempo di utilizzo reale e benefici"

il concetto di base è che una classe sigillata significa che non è possibile creare una sottoclasse (estendere) esso. Questo è l'intero motivo per cui la classe è sealed - questo "sigilla" la classe in modo che non possa essere estesa.

I metodi di estensione consentono di creare un metodo che compaia per estendere la classe, ma in realtà è un metodo statico normale. Il compilatore chiama questo metodo e passa l'istanza della classe.

+0

Grazie mille Reed, ho avuto gli occhi aperti ora .... Era vuoto su questo quando mi ha chiesto in un'intervista ... Stava cercando di confondermi nell'intervista :( – Learner

Problemi correlati