2012-05-27 10 views
5

w Javie, możemy zastąpić lub zaimplementować metody abstrakcyjne Podczas tworzenia instancji w następujący sposób:Przestawianie metody abstrakcyjne Podczas tworzenia instancji w C#

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

    } 
    public void AbstractMethod2(string i) { 

    } 
}; 

Czy jest to możliwe w języku C#? Jeśli tak, jakie to odpowiednik kod

Dzięki

Odpowiedz

8

Funkcja ta nazywa "anonymous class" Java, a nie „przesłonięcie metody na tworzenie instancji”. Nie ma identycznej funkcji w języku C#.

C# wykonano inną trasę - zamiast zapewnić wygodną składnię do tworzenia podklas, rozszerzono ją o funkcje delegatów, udostępniając anonymous delegates i lambdas. Lambdas pozwala ci podłączyć kawałki kodu.

0

Nie wiem Java, ale to "pachnie" jak Anonymous Types w C#.

Na przykład, można napisać coś takiego:

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

Nie, nie ma wiele wspólnego z klasami anonimowymi - nawet jeśli brzmią podobnie. – Voo

2

można osiągnąć coś bardzo podobnego poprzez inteligentne wykorzystanie lambdas:

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

Więc można użyć tej definicji w taki sposób:

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

Można również zdefiniować wszystkie metody jako część interfejsu, a następnie skonstruować klasę z konkretną implementacją interfejsu (proxy połączeń do konkretnej implementacji) - nazwałbym to Wzorem "Strategii". Ale to tylko odmiana tego tematu.

+0

To jest miłe, ale nie jest czymś, o czym powinien pomyśleć ktoś, kto dopiero uczy się języka C# :) – TDaver

+0

@DDaver, wyrażenia lambda były częścią .net przez ponad 4 lata, są wszędzie. Autor zna Javę, która ma lambda, więc nie jest to nowa koncepcja, tylko nieco inna (lepsza?) Składnia. –

+0

, podczas gdy ja się z tobą zgadzam, że lambdy są dobre i powinny być używane (szczególnie z LINQ), ale początkujący ma trudności w zrozumieniu klasowych rozważań na temat klasy bazowej takiej jak ta, którą sugerujesz :) – TDaver

Powiązane problemy