扩展类以符合接口

本文关键字:接口 扩展 | 更新日期: 2023-09-27 18:35:03

我有一个接口:

interface IFoo {
  int foo(int bar);
}

我现在可以扩展现有类以符合接口吗? 说类字符串。 我知道我可以在字符串上定义 foo(( 方法。 但是,是否可以更进一步告诉编译器字符串可以转换为IFoo?

扩展类以符合接口

你可以

用其他类来做,但不能用System.String,因为它是sealed的。

如果要对非密封类执行此操作,可以简单地从中派生,添加适当的构造函数,并将接口作为新类实现的内容。

interface IFoo {
    int Size {get;}
}
// This class already does what you need, but does not implement
// your interface of interest
class OldClass {
    int Size {get;private set;}
    public OldClass(int size) { Size = size; }
}
// Derive from the existing class, and implement the interface
class NewClass : OldClass, IFoo {
    public NewCLass(int size) : base(size) {}
}

当类被密封时,通过组合将其呈现为某个接口的唯一解决方案是:编写一个实现接口的包装类,为其提供密封类的实例,并编写"转发"调用目标类的包装实例的方法实现。

我认为

这个问题可以重述为,"我可以使用扩展方法使密封类实现以前没有的接口吗? 正如其他人指出的那样,String 类是密封的。 但是,我认为您必须在其声明中命名类实现的接口:

public someClass : IFoo
{
    // code goes here
}

所以你不能直接对 String 执行此操作,不仅仅是因为它是密封的,还因为你没有它的源代码。

你能做的最好的事情就是创建你自己的类,它有一个字符串,并像字符串一样使用它。 String 需要执行的任何操作都必须在其 String 成员上执行(从而使其公开(,或者必须包装/重新实现所需的方法:

public class betterString : IFoo
{
   public String str {get; set;}
   public foo(int i)
   {
      // implement foo
   }
}

然后,当使用它时:

public void someMethod(betterString better)
{
   better.foo(77);
   System.Console.WriteLine(better.str);
}