2013-11-02 93 views
1

我创建了一个名为MostRecentStack<T>的类,它是一个只保留一定数量项目的堆栈,将最下面的项目放在底部以腾出空间给新的项目。我想有一个变量,可以存储对常规(“无限”)堆栈的引用,也可以根据具体情况存储一个自定义类型,但C#没有定义通用的“堆栈”接口。通常这不会是一个问题,但我想System.Collections.Generic.Stack<T>来实现接口。声明一个接口是由一个类实现的

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

+0

要实现一个接口,一个类需要声明为实现接口,所以你想要的是不可能的。你可以从System.Collections.Generic.Stack 中派生一个类,它除了实现新的接口外什么都不做。然后,您可以在代码中使用派生类代替System.Collections.Generic.Stack 。 – Baldrick

+0

好主意!如果没有人有更好的想法,您应该将其作为答案提交,但我可以将其标记为已接受。谢谢! – flarn2006

+0

非常高兴这是有帮助的,我已经添加它作为答案。 – Baldrick

回答

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而没有任何问题。

+0

接受,因为这是我最终做的。再次感谢! – flarn2006

4

不,不可能将新界面添加到您不拥有的现有类。选项:

  • 如果您通过某个依赖注入控制器获得该类的实例,则可以通过调用匹配方法来实现接口的代理。
  • 你可以简单地从现有的类和添加接口(如果它没有密封)派生并开始使用你的类。
  • 在你的特殊情况下,Baldrick指出你可以做反向 - 从现有类和实现接口派生。
  • 您可以尝试使用dynamic来获得一些鸭子打字(因为这两个类将具有匹配的方法)以获得一些性能,可读性和强类型成本。

边注:一般C#不支持鸭打字,但其中实现接口要求不严格的一例(foreach) - 只是有关于收集正确的方法,就足以支持foreach

+1

不只是一个('foreach'):当使用查询理解语法时,也适用于LINQ运算符('where,'select'等)和'await'(当使用async时)。 –