1

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

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

4

2 回答 2

4

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

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

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

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

于 2013-11-02T02:57:35.777 回答
4

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

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

旁注:一般 C# 不支持鸭子类型,但有一种foreach情况foreach

于 2013-11-02T02:57:47.323 回答