为什么java可以实例化接口,这种语法和C#怎么对应的?

发布于 2022-09-01 06:00:03 字数 1454 浏览 41 评论 0

private void doWebLogin(String verifyCode, final ProcActionFuture future) {
    LoginModule login =  getContext().getModule(QQModule.Type.LOGIN);
    QQAccount account = getContext().getAccount();
    login.webLogin(account.getUsername(), account.getPassword(),
            account.getUin(), verifyCode, new QQActionListener() {    // 此处的QQActionListener是个接口,在下面
                public void onActionEvent(QQActionEvent event) {
                    if (event.getType() == QQActionEvent.Type.EVT_OK) {
                        doCheckLoginSig( (String) event.getTarget(),future);
                    } else if (event.getType() == QQActionEvent.Type.EVT_ERROR) {
                        QQException ex = (QQException) (event.getTarget());
                        if(ex.getError()==QQErrorCode.WRONG_CAPTCHA){
                            doGetVerify(ex.getMessage(), future);
                        }else{
                            future.notifyActionEvent(
                                    QQActionEvent.Type.EVT_ERROR,
                                    (QQException) event.getTarget());
                        }
                    }
                }
            });
}

public interface QQActionListener {
    public void onActionEvent(QQActionEvent event); 
}

那么这种语法在C#里怎么【更好的】移植呢?
我现在的做法是重写一个类,继承QQActionListener,然后在实例化。
但是这种写法在这个项目中比较多,所以要为了一个方法就要重新写一个类,实在是太难看了。

请问有什么方法能更好的该写如上面的那样的java语法到C#吗

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

半夏半凉 2022-09-08 06:00:03

可以使用委托来模拟实现,单方法的接口直接用委托(Lambda表达式)解决,当然这个需要上层接口允许使用委托才行。多方法的接口需要实现一个辅助类

csharppublic interface IQQActionListener {
    void OnActionEvent(QQActionEvent event);
}

public class Something {
    private void doWebLogin() {
        login.webLogin(name, password, new DelegateQQActionListener {
            ActionEvent = (event) => {
                // event is a QQActionEvent reference
                if (event.getType() == QQActionEvent.Type.EVT_OK) {

                } else {

                }
            }
        })
    }

    private class DelegateQQActionListener: IQQActionListener {
        public Action < QQActionEvent > ActionEvent {
            get;
            set;
        }

        public OnActionEvent(QQActionEvent event) {
            if (ActionEvent != null) {
                ActionEvent(event)
            }
        }
    }
}
若相惜即相离 2022-09-08 06:00:03

你要知道JAVA这样写的意义在哪~最常见的用法是用于您代码里提出来的这种方法。其实本质上他就是传一个方法进去使用。OK~c#都有delegate了,都有Lambda了,干嘛还要用这样笨重的语法呢?

好菇凉咱不稀罕他 2022-09-08 06:00:03

没多大移植的意义, c#没有类似的语法, 接口必须写个类实现。

但是从你代码上看,你的接口里面只有onActionEvent一个方法。 可以去掉该接口,

使用c#的委托或事件代替,可能更加简单。

怎会甘心 2022-09-08 06:00:03

这是java的匿名内部类,C#中好像有委托和事件的办法,去了解一下

九公里浅绿 2022-09-08 06:00:03

匿名内部类实现了这个接口

堇年纸鸢 2022-09-08 06:00:03

C#的event就是破你Java的Listener

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文