2

我是 C# 的新手,在理解如何实现接口的扩展方法方面存在问题。我没有找到任何关于这个问题的材料。从我发现的关于 C# 中的一般扩展方法的材料中,我期望以下简单的演示示例工作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace testExtension
{
public  interface  IcheckThingsOut
{
   bool x();
}
public static class extensionInterface
{
   public static bool y(this IcheckThingsOut bla) { return true;}
}
public class implementInteface : IcheckThingsOut
{
   bool IcheckThingsOut.x()
   {
       return true;
   }
   bool IcheckThingsOut.y()
   {
       return false;

   }
}
}

但是编译器仍然不满意。我错过了什么,这里的正确语法是什么(与代码具有相同的语义)?

4

5 回答 5

3

你搞砸了扩展方法和接口的概念。扩展方法只是在静态类上调用静态方法的一种编译器方便的方法。它们不扩展接口。编译器在使用扩展方法时所做的是:

  IcheckThingsOut instance = new IcheckThingsOutImpl();
  instance.y();

...将转换为:

  IcheckThingsOut instance = new IcheckThingsOutImpl();
  extensionInterface(instance, y);

如您所见, y 不是您界面上的方法。这就是为什么您不能在实现中显式实现它的原因。

于 2012-06-14T18:17:24.063 回答
3

您似乎希望使用的是“扩展方法”。extensionInterface为此目的,您的课程已正确实施。

但是,创建扩展方法实际上并不扩展您的接口,因此尽管您可以调用,但您不能在隐式或显式myIcheckThingsOut.y()实现的类中重新实现该方法。IcheckThingsOut

于 2012-06-14T18:17:27.697 回答
2

您不能更改“扩展”类或接口内的扩展方法的实现。扩展方法是实现。

扩展方法提供了一种将方法“添加”到接口或类的方法。整个想法是您正在扩展的接口或类并不“知道”这些方法。换句话说,您“添加”功能而不改变类或接口本身。

(请注意,虽然符号表明您正在向接口添加方法,但实际上这些方法就运行时而言是普通的静态方法)。

于 2012-06-14T18:15:53.390 回答
1
bool IcheckThingsOut.y()
{
    return false;

}

错了: IcheckThingsOut 没有为 function 提供原型y。它应该只是

bool y()
{
    return false;
}

因为它只是遮蔽了另一种方法

于 2012-06-14T18:17:15.480 回答
0

IcheckThingsOut 没有 bool y()

于 2012-06-14T18:15:53.737 回答