C#初始化抽象类,如Java

时间:2016-11-29 03:50:33

标签: java c#

在Java中,我能够拥有这样的课程:

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

然后使用:

初始化它
Button b = new Button(){
    @Override
    public void onClick(){
    // Things
    }
}

现在有没有办法在C#中做类似的事情?

或者我最好的选择是使用活动吗?

4 个答案:

答案 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();
                }
            }
        }
    }
}