【问题标题】:Delegate parameter in interface method接口方法中的委托参数
【发布时间】:2022-01-03 09:08:11
【问题描述】:

我提前道歉,因为我觉得我要解释我想要做的事情真的很糟糕。

我的应用程序中有许多模型,每个模型都实现了一个名为“IDatabaseItem”的接口,我希望每个“IDatabaseItem”都有一个返回 true 或 false 的 Delete 方法,但我也希望该方法能够接受一个委托(字符串),所以当执行删除方法时,我也可以返回一个字符串结果来判断操作是否成功。这也将允许调用者处理他们选择的结果。在我的应用程序中,这可能类似于 UI 中的弹出窗口。

这就是我认为我会如何实现这样一个东西的一种方式。

    public interface IDatabaseItem
{
    int Id { get; }
    DateTime Date { get; }

    delegate void DBOperationResult(string result);

    bool Delete(DBOperationResult foo);
}

尝试上述操作时,我得到了编译器结果: Error CS8370 Feature 'default interface implementation' is not available in C# 7.3. Please use language version 8.0 or greater.

通过阅读其他帖子,我想我可能会在树上吠叫,并且代表和接口不混合。但我们将不胜感激。

【问题讨论】:

  • 您应该能够在接口之外定义委托,它应该可以工作。
  • Delegate 需要在接口之外定义。目前还不清楚如何将委托返回的值返回给接口方法调用者。
  • 这是一个很奇怪的API。您想同步报告成功/失败,但使用异步回调报告失败模式?为什么不能像普通人一样使用异常?或者,您可以返回 DbOperationFailure?,其中 null 结果表示成功...
  • 公平积分。也许我需要重新考虑在这种情况下使用委托。也许我应该像 Aron 建议的那样使用例外,做一个“正常”的人。感谢您的反馈。

标签: c# interface delegates


【解决方案1】:

委托的声明本身就是一个类型,就像声明一个接口或一个类一样。在 C# 7.3 及更早版本中,接口不支持嵌套类型。要使您的代码正常工作,您必须将委托声明移至外部范围。

public delegate void DBOperationResult(string result); // a type itself

public interface IDatabaseItem
{
    int Id { get; }
    DateTime Date { get; }

    bool Delete(DBOperationResult foo);
}

随着 C# 8.0 中“默认接口实现”的引入,接口已扩展为允许声明嵌套类型(如您的委托)。

更多详情请见https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods

【讨论】:

  • 谢谢你这是完美的,正是我正在寻找的答案。描述得很好。我现在明白了很多。真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多