在Java中,我能够拥有这样的课程:
public abstract class Button{
public abstract void onClick();
}
然后使用:
初始化它Button b = new Button(){
@Override
public void onClick(){
// Things
}
}
现在有没有办法在C#中做类似的事情?
或者我最好的选择是使用活动吗?
答案 0 :(得分:2)
如果你想使用Abstract Class,你需要从该Abstract Class继承另一个类,并使用它来初始化抽象类,如下所示:
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();
答案 1 :(得分: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*/});
答案 2 :(得分:0)
正如其他答案所显示的那样,你可以做类似的事情,但问题是“你应该这样做吗?”'答案是否定的。
为这类事件创建了事件,因此请使用事件。它不仅代码更清晰,更清晰,而且是C#开发人员所熟知的完善模式,因此使用它有助于代码的可维护性。
答案 3 :(得分:-1)
C#中与Java匿名内部类功能类似的方法是实例化动态对象并将其转换为抽象类。不幸的是,您必须自己实施转换。 示例:
using System;
namespace AnonymousInnerClassExample
{
class Program
{
public static void Main(string[] args)
{
Button button = Button.CreateFromDynamic(new
{
OnClick = new Action(() =>
{
Console.WriteLine("Hit OnClick");
})
});
button.OnClick();
}
public abstract class Button
{
public abstract void OnClick();
public static Button CreateFromDynamic(dynamic button)
{
return new Implementation(button);
}
private class Implementation : Button
{
public Implementation(dynamic button)
{
PrivateOnClick = button.OnClick;
}
private Action PrivateOnClick { get; set; }
public override void OnClick()
{
PrivateOnClick();
}
}
}
}
}