7

我有一个界面:

interface IFoo {
  int foo(int bar);
}

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

4

2 回答 2

9

你可以用其他类来做,但不能用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) {}
}

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

于 2013-10-13T02:43:15.060 回答
1

我认为这个问题可以重新表述为,“我可以使用扩展方法使密封类实现它以前没有的接口吗?” 正如其他人指出的那样, 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);
}
于 2013-10-13T02:56:59.483 回答