将接口声明为由类实现

时间:2013-11-02 02:44:57

标签: c# class oop interface polymorphism

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

只要一个类提供了所需的成员,是否有任何方法可以在接口定义中告诉编译器将类视为实现接口?我希望能够在不必使用as或其他类型转换方法的情况下完成此操作。

2 个答案:

答案 0 :(得分: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传递而没有任何问题。

答案 1 :(得分:4)

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

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

旁注:一般来说,C#不支持duck typing,但有一种情况(foreach),其中不严格要求实现接口 - 只需要正确的收集方法就足以支持foreach