2012-05-27 73 views
5

在java中在實例創建抽象方法,我們可以覆蓋或實現在實例創建抽象方法如下:覆蓋在C#

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

    } 
    public void AbstractMethod2(string i) { 

    } 
}; 

這是可能在C#中?如果是,什麼是等效代碼

感謝

回答

8

這個Java功能稱爲"anonymous class",而不是「關於創建實例方法的重寫」。在C#中沒有相同的功能。

C#採取了不同的路線 - 而不是提供創建子類的方便語法,它擴大在其委託功能,提供anonymous delegateslambdas。 Lambdas讓你插入一段代碼。

0

不知道Java,但這個「聞起來」像Anonymous TypesC#

例如,你可以寫這樣的:

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

不,與匿名類沒有多少共同之處 - 即使它們聽起來很相似。 – Voo

2

可以實現通過巧妙地利用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;} 
} 

所以,你可以使用這個定義,像這樣:

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

您也可以將所有方法定義爲接口的一部分,然後用一個接口的具體實現構造一個類(代理調用具體實現) - 我會稱之爲「策略」模式。但這只是這個主題的變體。

+0

這很好,但不是某個剛剛學習C#的人應該考慮的問題:) – TDaver

+0

@TDaver,lambda表達式已超過.net 4年的一部分,它們無處不在。作者熟悉Java,它有一個lambda表達式,所以它不是一個新概念,只是一個稍微不同的(更好的)語法。 –

+0

雖然我同意你lambda表達良好,應該使用(特別是與LINQ),但初學者很難真正掌握基類的類設計考慮,如你建議的:) – TDaver