C#初始化像Java

问题描述:

在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

只为其他人试图做类似的事情。 @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*/}); 

如果你想使用抽象类,你需要有从抽象类继承另一个类,并用它来初始化抽象类是这样的:

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

这是比使用委托更好的方法,因为它可以处理可能涉及多个方法的一般情况。 –

至于其他的答案显示,你可以做类似的事情,但真正的问题是'你应该吗?'答案是否定的。

事件是为这种事情创建的,所以使用事件。它不仅更清晰,更干净的代码,而且它是C#开发人员都知道的一个非常成熟的模式,所以使用它可以帮助代码的可维护性。