【问题标题】:Declare an interface as being implemented by a class将接口声明为由类实现
【发布时间】:2013-11-13 08:13:36
【问题描述】:

我创建了一个名为MostRecentStack<T> 的类,它是一个仅保留一定数量项目的堆栈,将那些放在底部的项目为新项目腾出空间。我希望有一个变量可以存储对常规(“无限”)堆栈或我的自定义类型之一的引用,具体取决于具体情况,但 C# 没有定义通用“堆栈”接口。通常这不会有问题,但我希望System.Collections.Generic.Stack<T> 也能实现该接口。

只要一个类提供了所需的成员,有没有办法在接口定义中告诉编译器考虑一个类来实现接口?我希望能够做到这一点,而不必使用 as 或其他类型转换方法。

【问题讨论】:

  • 要实现一个接口,需要将一个类声明为实现该接口,所以你想要的不太可能。您可以从 System.Collections.Generic.Stack 派生一个类,它除了实现新接口之外没有任何新功能。然后,您可以在代码中使用该派生类代替 System.Collections.Generic.Stack
  • 好主意!您应该将其作为答案提交,如果没有人有更好的想法,我可以将其标记为已接受。谢谢!
  • 很高兴它有帮助,我已将其添加为答案。

标签: c# class oop interface polymorphism


【解决方案1】:

您所要求的确切内容是不可能的。但是,类似的东西应该与您想要的非常相似:

public class CompatibleStack<T> : System.Collections.Generic.Stack<T>, IYourStackInterface<T>
{
}

CompatibleStack 在功能上等同于 System.Collections.Generic.Stack,只是它现在实现了 IYourStackInterface。

只要 System.Collections.Generic.Stack 有所有正确的成员来实现 IYourStackInterface,这应该可以正常编译。而且您可以毫无问题地将 CompatibleStack 作为 IYourStackInterface 传递。

【讨论】:

  • 接受,因为这是我最终做的。再次感谢!
【解决方案2】:

不,不能向您不拥有的现有类添加新接口。选项:

  • 如果您通过一些依赖注入控制器获取类的实例,您可以使用代理包装类,该代理将通过调用匹配方法来实现接口。
  • 您可以简单地从现有类派生并添加接口(如果未密封)并开始使用您的类。
  • 在您的特定情况下,正如 Baldrick 指出的那样,您可以进行反向操作 - 从现有类派生并实现接口。
  • 您可以尝试使用 dynamic 来获得一些鸭子类型(因为两个类都会有匹配的方法)以获得一些性能、可读性和强大的类型成本。

旁注:一般 C# 不支持鸭子类型,但有一种情况 (foreach) 并不严格要求实现接口 - 只需在集合上有正确的方法就足以支持 foreach

【讨论】:

  • 不只是一个(foreach):也适用于使用查询理解语法时的 LINQ 运算符(whereselect 等)和await(使用异步时) .
猜你喜欢
  • 2019-03-11
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
相关资源
最近更新 更多