【问题标题】:Using an interface from class in C# [duplicate]在 C# 中使用类中的接口 [重复]
【发布时间】:2017-03-24 18:24:51
【问题描述】:

我有一个类,其中有一个接口,如下所示:

 public class hcmTerminal {

    ... Code

    public interface onDataReceived {
        void isCompleted(bool done);
    }

}

在这个类中我有公共财产:

public onDataReceived mDataReceived;

然后我有一个函数来设置委托:

public void setDataReceived(onDataReceived dataReceived) { mDataReceived = dataReceived; }

在 hcmTerminal 类中,我正在调用委托:

mDataReceived.isCompleted(true);

但我无法弄清楚调用该委托时实际获取的语法,在 java 中我可以去:

myTerminal.setDataReceived(new hcmTerminal.onDataReceived(){

    @Override
    public void isCompleted(boolean done){

        ... Code

    }

});

但如果我在 C# 中尝试,我会得到:

无法创建抽象或接口的实例 'hcmTerminal.onDataReceived'

我以前不必在 C# 中创建接口。此代码来自我在 Java 中的实现方式。

【问题讨论】:

  • 非常强烈建议您在编写 C# 时遵循 .NET 的命名约定,在编写 Java 时遵循 Java。目前你违反了这两个。
  • 只是让您知道接口的方法不是委托。 C# 使用委托类型而不是接口。但是,如果您使用接口,则必须创建一个实现该接口的类。
  • 至于您的界面 - 您是否有任何理由创建界面而不是委托?你谈论一个委托,但你声明一个接口......
  • 我不确定我是否找到了最好的副本,更多 - bing.com/…

标签: c# interface delegates


【解决方案1】:

通过使用事件,你可以做到这一点

 class HcmTerminal {
      public event Action<bool> OnDataReceived;

      public void Launch()
      {
           OnDataReceived?.Invoke(true /*or false*/);
      }

 }

你可以这样做:

var myTerminal = new HcmTerminal();
myTerminal.OnDataReceived += (isCompleted) => {};

【讨论】:

    【解决方案2】:

    定义一个实现接口的类:

    class MyDataReceived : hcmTerminal.onDataReceived {
        public void isCompleted(bool done) {
            Console.WriteLine("call to isCompleted. done={0}", done);
        }
    }
    

    现在您可以拨打myTerminal.setDataReceived(new MyDataReceived())

    但是,这是用 C# 编码的 Java 解决方案,而不是“本机”C# 解决方案。更好的方法是定义一个委托来代替接口:

    public class HcmTerminal {
        ... Code
        public delegate void OnDataReceived(bool done);
    }
    

    这将允许您使用多个 C# 功能来提供委托实现,例如提供方法名称、提供匿名委托或使用 lambda:

    myTerminal.setDataReceived((done) => {
        Console.WriteLine("call to isCompleted. done={0}", done);
    });
    

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 2011-01-19
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2011-04-02
      相关资源
      最近更新 更多