2010-08-09 56 views
9

我可以像在Java中一樣在C#/ .net中創建抽象類的實例嗎?有沒有在C#中創建一個匿名子類的語法?

附加信息

我想我們很多人不明白這是什麼意思? 所以,在java中我可以創造這樣的抽象類:

簡單的抽象類:

/** 
* @author jitm 
* @version 0.1 
*/ 
public abstract class TestAbstract 
{ 
    public abstract void toDoSmth(); 
} 

代碼,我已經創建抽象類的實例

/** 
* @author jitm 
* @version 0.1 
*/ 
public class Main { 
    public static void main(String[] args) { 
     TestAbstract testAbstract = new TestAbstract() { 
      @Override 
      public void toDoSmth() { 
       System.out.println("Call method toDoSmth"); 
      } 
     }; 
    } 
} 

我能和在C#做這樣的事情?

+6

目前你的問題*太*太含糊。尤其是,您在標題和標籤中提到了抽象類,但在文本的正文中沒有提到。如果您有一段特定的Java代碼,請將其發佈。 – 2010-08-09 18:34:23

+1

他提到了一個名爲「Abstact」的類。可能是相關的。 – 2010-08-09 18:44:38

+0

不,類抽象等於抽象:) – jitm 2010-08-09 18:57:15

回答

8

無論是在Java中還是在C#中,您都可以創建抽象類的實例。 您將始終需要創建一個從抽象類繼承的具體類。 Java可以讓你在沒有命名類的情況下使用匿名類。 C#不會給你這個選項。

(編輯,以顯示委託作爲替代品。我沒有訪問VS這裏,所以它可能無法編譯,但這是想法)在Java中

通常當你使用抽象類一個單一的抽象方法(SAM)你真正想要實現的是傳遞一些代碼作爲參數。 假設您需要使用集合對基於類名稱的對象數組進行排序。排序(收集,比較器) (我知道的比較是一個接口,但它是一樣的想法) 使用匿名類,以避免額外的輸入,你可以寫類似

Comparator<Object> comparator = new Comparator<Object>{ 
     @Override 
     public int compare(Object o1, Objecto2) { 
      return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName())); 
     }//I'm not checking for null for simplicity 
    } 
    Collections.sort(list, comparator) 

在C#2.0及以後的你可以使用Comparison<T>委託做幾乎相同的操作。一個委託可以被認爲是一個函數對象,或者用java語言來說,就是一個具有單一方法的類。你甚至不需要創建一個類,而只需要使用關鍵字委託的方法。

Comparison<Object> comparison = delegate(Object o1, Object o2) 
{ 
    return o1.class.Name.CompareTo(o2.class.Name);   
}; 

list.sort(comparison); 

在C#3.0及以後你可以編寫使用lambda表達式和類型推斷甚至更少的代碼:

list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name)) 

無論如何,如果要遷移代碼形式的Java與C#,你應該閱讀有關代表...在許多情況下,您將使用代表而不是匿名類。在你的情況下,你使用的方法void toDoSmth()。有一個名爲Action的代理,它幾乎是一樣的東西,一個沒有參數但沒有返回的方法。

+0

是的,我的問題是我可以創建像java中的實例(使用匿名),目前我明白我不能。 謝謝。 – jitm 2010-08-09 19:35:19

+2

在某些情況下(大多數情況下),應該使用委託來替換匿名類,並且您將編寫更少的代碼...特別是使用一個方法類。 – 2010-08-09 20:05:36

+0

2 Pablo:你能舉例說明如何去做,因爲目前我已經從抽象創建了簡單的類並使用它。 – jitm 2010-08-10 07:04:25

8

不,不直接。最接近你可以來(假設你有下面的類結構):

public abstract class AbstractClass 
{ 
} 

public class ChildClass : AbstractClass 
{ 
} 

是:

AbstractClass instance = new ChildClass(); 
0

如果你談論的是一個抽象類,答案是否定的。他們幾乎一樣的接口,但允許其可之後的具體對象可用於實現.. 您必須創建從抽象類

見繼承具體的類更在Abstract Classes

+0

請不要發佈.NET 1.1鏈接! – 2010-08-09 19:22:48

0

不,你不能 - 這就是爲什麼這個類被稱爲抽象。你可以從它派生出來,從而創建可以實例化的具體實現的類。

0

你問的是有點混亂。如果你問是否可以創建一個類的實例,那麼你當然可以。爲什麼C#或任何語言讓你能夠定義一個類,但不能實例化它?

如果您問是否可以創建抽象類的實例,答案是否定的。您必須從抽象類派生一個新類,然後實例化新類。

-1

在這種情況下,C#和Java是一樣的,你不能實例化一個抽象類。

+0

在Java中我可以,只有我需要它是實現抽象方法,但是,我可以像匿名實現那樣做。 – jitm 2010-08-09 18:59:05

+0

在這種情況下,然後沒有 - C#(據我所知不允許你創建一個抽象類的匿名實現)。 – RQDQ 2010-08-09 19:21:27

+0

您還沒有實例化抽象類,您正在實例化一個匿名子類。 – Struan 2010-08-09 19:34:15

相關問題