如何将代理添加到接口C#

Asa*_*saf 82 c# delegates interface

我需要在班上有一些代表.

我想使用界面"提醒"我设置这些代表.

如何?

我的班级看起来像这样:

public class ClsPictures : myInterface
{
    // Implementing the IProcess interface
    public event UpdateStatusEventHandler UpdateStatusText;
    public delegate void UpdateStatusEventHandler(string Status);

    public event StartedEventHandler Started;
    public delegate void StartedEventHandler();
}
Run Code Online (Sandbox Code Playgroud)

我需要一个界面来强制这些代表:

public interface myInterface
{
   // ?????
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 130

那些是宣布代表类型.它们不属于界面.使用这些委托类型的事件可以在接口中使用:

public delegate void UpdateStatusEventHandler(string status);
public delegate void StartedEventHandler();

public interface IMyInterface
{       
    event UpdateStatusEventHandler StatusUpdated;    
    event StartedEventHandler Started;
}
Run Code Online (Sandbox Code Playgroud)

该实现不会(也不应该)重新声明委托类型,而不是重新声明接口中使用的任何其他类型.

  • @Purusartha:那不是可访问性 - 这只是代理类型(类,实际上)和接口等一样的问题. (7认同)
  • 我没有意识到代表具有与类相同级别的可访问性.我一直认为他们需要封装在一个类中. (4认同)

DEL*_*zed 28

从.NET 3.5开始,您还可以使用System.Action委托,这将产生以下接口:

public interface myInterface
{       
   // Implementing the IProcess interface
   event Action<String> UpdateStatusText;

   event Action Started;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有解决问题(如何实现 myInterface)。 (4认同)
  • 在接口中使用“Action”委托的一个问题是,从类型参数来看,参数所代表的含义并不明显,这可能没问题,并且对于单个参数可能很明显,但当有多个参数时,它很快就会变得混乱。在这种情况下,委托类型更好。 (3认同)
  • 我同意大卫的观点,假设你有 `Func&lt;string, int, Task&gt; ExecuteQuery { get; }` 字符串值是什么可能是显而易见的,但是 int 值是什么?使用委托,您可以更好地定义它,如“public delegate Task ExecuteQueryHandler(string query, int timeout);” 现在每个参数是什么都 100% 清楚。 (2认同)

小智 8

只需将委托作为属性公开

public delegate void UpdateStatusEventHandler(string status);
public delegate void StartedEventHandler();

public interface IMyInterface
{       
    UpdateStatusEventHandler StatusUpdated {get; set;}    
    StartedEventHandler Started {get; set;}
}
Run Code Online (Sandbox Code Playgroud)


Ira*_*chi 7

Jon Skeet的回答是对的,我只想添加一个注释.

界面不是为了"提醒"你做什么,或者在你的课程中包括什么.接口是抽象的手段,用于面向对象的编程和设计方法.也许你根本不需要接口声明,除非你想看到一些具体的类实例作为程序中其他地方的接口(Abstraction).

如果要在项目中强制执行某些编码标准,可能需要尝试使用代码分析工具(如在Visual Studio中) - 它们允许扩展,您可以合并添加自己的代码分析规则.

使用代码分析,如果你"忘记"添加代理(虽然我没有看到忘记它的点,好像没有使用委托,也不需要),你会收到警告/错误.

  • 你可能是对的,但有时你会做出一些假设,即使有很好的文档,一段时间后也很难记住。我尝试重用我的代码,但有时我不记得它的核心是什么,它不是什么(当涉及到委托时 - 我很难看到大局......) (2认同)