2012-05-27 19 views
5

in Java, siamo in grado di annullare o implementare i metodi astratti su creazione dell'istanza come segue:override metodo astratto al momento della creazione esempio in C#

AbstractClass test =new AbstractClass() 
{ 
    public void AbstractMethod(string i) { 

    } 
    public void AbstractMethod2(string i) { 

    } 
}; 

Questo è possibile in C#? se sì, qual è il codice equivalente

Grazie

risposta

8

Questa funzione si chiama Java "anonymous class", non "un override del metodo su creazione dell'istanza". Non esiste una funzionalità identica in C#.

C# ha preso una strada diversa - invece di fornire la sintassi della comodità per la creazione di sottoclassi, ha ampliato le sue funzionalità delegate, fornendo anonymous delegates e lambdas. Lambdas ti consente di collegare pezzi di codice.

0

Non so Java, ma questo "odora" come Anonymous Types in C#.

Ad esempio, è possibile scrivere qualcosa di simile:

var myNewType = new { 
         Name = "Charles", 
         Surname="Dickens", 
         Age = 55 
         }; 
+1

No, non ha molto in comune con le classi anonime, anche se sembrano simili. – Voo

2

È possibile ottenere qualcosa di molto simile attraverso l'uso intelligente di lambda:

public class BaseClass { 

    public BaseClass(Action<string> abs1 = null, Action<string> abs2 = null){ 
     AbstractMethod1 = abs1 ?? s=>{}; 
     AbstractMethod2 = abs2 ?? s=>{}; 
    } 

    public Action<string> AbstractMethod1 {get; private set;} 
    public Action<string> AbstractMethod2 {get; private set;} 
} 

Così si potrebbe usare questa definizione in questo modo:

new BaseClass(s=> Console.WriteLine(s), s=> Console.WriteLine(s)); 

È inoltre possibile definire tutti i metodi come parte di un'interfaccia e quindi costruire una classe con un'implementazione concreta dell'interfaccia (proxy delle chiamate verso l'implementazione concreta) - La chiamerei modello "Strategia". Ma questa è solo una variazione di questo tema.

+0

Questo è bello, ma non qualcosa che qualcuno che sta imparando C# dovrebbe pensare :) – TDaver

+0

@TDaver, le espressioni lambda sono state parte di .net per più di 4 anni, sono ovunque. L'autore ha familiarità con Java, che ha un lambda, quindi non è un nuovo concetto, solo una sintassi leggermente diversa (migliore?). –

+0

mentre sono d'accordo con te sul fatto che i lambda sono buoni e dovrebbero essere usati (specialmente con LINQ), ma un principiante ha difficoltà a cogliere effettivamente le considerazioni sulla progettazione di classe di una classe base come quella che stai suggerendo :) – TDaver

Problemi correlati