C#初始化像Java
问题描述:
在Java中抽象类,我能够有这样一类:C#初始化像Java
public abstract class Button{
public abstract void onClick();
}
然后初始化它使用:
Button b = new Button(){
@Override
public void onClick(){
// Things
}
}
现在有没有办法做一个类似的东西在C#中?
或者我最好是使用事件?
答
只为其他人试图做类似的事情。 @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#开发人员都知道的一个非常成熟的模式,所以使用它可以帮助代码的可维护性。
我不知道有关C#语法问题的答案。但我认为我们不能回答有关事件的问题。具有'onClick'方法的抽象类的原因将是因为有像Swing或Android运行时这样的平台期望使用定义了'onClick'的类。你在C#中使用类似的平台吗?或者你在编写自己的平台? – ajb
C#没有相当于匿名类。但是,您可以使用委托和lambdas类似的效果。 – shmosel
我使用我自己的平台,所以我不需要它是一个onClick方法。这只是在Java中,我会使用类似于我上面发布的内容,因为在C#中我不确定什么是最好的方式来做到这一点。 – Bimmr