2016-11-29 76 views
0

在Java中抽象類,我能夠有這樣一類:C#初始化像Java

public abstract class Button{ 
    public abstract void onClick(); 
} 

然後初始化它使用:

Button b = new Button(){ 
    @Override 
    public void onClick(){ 
    // Things 
    } 
} 

現在有沒有辦法做一個類似的東西在C#中?

或者我最好是使用事件?

+0

我不知道有關C#語法問題的答案。但我認爲我們不能回答有關事件的問題。具有'onClick'方法的抽象類的原因將是因爲有像Swing或Android運行時這樣的平臺期望使用定義了'onClick'的類。你在C#中使用類似的平臺嗎?或者你在編寫自己的平臺? – ajb

+0

C#沒有相當於匿名類。但是,您可以使用委託和lambdas類似的效果。 – shmosel

+0

我使用我自己的平臺,所以我不需要它是一個onClick方法。這只是在Java中,我會使用類似於我上面發佈的內容,因爲在C#中我不確定什麼是最好的方式來做到這一點。 – Bimmr

回答

0

只爲其他人試圖做類似的事情。 @shmosel建議lambdas,所以這就是我使用的。

public class Button(){ 
    private Action _onClick; 

    public Button(Action onClick){ 
     _onClick = onClick; 
    } 

    //Other method that calls _onClick() 
} 

//Other Class 
Button b = new Button(() => {/*Do Code Here*/}); 
3

如果你想使用抽象類,你需要有從抽象類繼承另一個類,並用它來初始化抽象類是這樣的:

public class MeSecondClass : MyClass 
    { 
     public override void OnClick(object sender, EventArgs args) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public abstract class MyClass 
    { 
     public abstract void OnClick(object sender, EventArgs args); 
    } 


    MyClass a = new MeSecondClass(); 
+0

這是比使用委託更好的方法,因爲它可以處理可能涉及多個方法的一般情況。 –

0

至於其他的答案顯示,你可以做類似的事情,但真正的問題是'你應該嗎?'答案是否定的。

事件是爲這種事情創建的,所以使用事件。它不僅更清晰,更乾淨的代碼,而且它是C#開發人員都知道的一個非常成熟的模式,所以使用它可以幫助代碼的可維護性。