簡體   English   中英

是否有在C#中創建匿名子類的語法?

[英]Is there a syntax for creating an anonymous subclass in C#?

我可以像在Java中一樣在C#/ .net中創建抽象類的實例嗎?

附加信息

我想我們很多人都不懂我的意思? 所以,在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#做這樣的事嗎?

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

(編輯顯示代表作為替代。我在這里沒有訪問VS,所以它可能無法編譯,但這是個主意)

通常在Java中使用帶有單個抽象方法(SAM)的抽象類時,您真正想要實現的是將一些代碼作為參數傳遞。 假設您需要根據類名對對象數組進行排序,使用Collections.sort(Collection,Comparator)(我知道Comparator是一個接口,但它是相同的想法)使用匿名類來避免額外的輸入,你可以寫類似的東西

   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單詞中,可以被認為是一個具有單個方法的類。 您甚至不需要創建類,只需要使用關鍵字delegate的方法。

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

list.sort(comparison);

在C#3.0及更高版本中,您可以使用lambdas和類型推斷編寫更少的代碼:

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

無論如何,如果您要將代碼從java遷移到c#,您應該閱讀有關委托的內容......在許多情況下,您將使用委托而不是匿名類。 在您的情況下,您使用的方法void toDoSmth()。 有一個名為Action的委托,它幾乎是一回事,一個沒有參數且沒有返回的方法。

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

public abstract class AbstractClass
{
}

public class ChildClass : AbstractClass
{ 
}

方法是:

AbstractClass instance = new ChildClass();

在這種情況下,C#與Java相同,您無法實例化抽象類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM