当从具体类中抽象出一个接口时,接口是否应该包含扩展方法?上下文专门用于易于单元测试。
答案 0 :(得分:0)
如果某个课程取决于SomeOtherClass
,并且它取决于SomeOtherClass
的实例成员和静态成员,那么您可以
SomeOtherClass
。通过使用依赖项的实例和静态成员,它实际上成为一个中的两个依赖项。您依赖于对象(实例成员)和对象的类型(静态成员)。
如果类本身需要这些方法才能运行,那么它们应该是该类的成员。如果需要它们以便其他类以超出该类职责的方式使用该类(比如将类映射到其他类的方法),那么我将其分离出来。
如果方法都是 - 类需要并且其他类需要,那么你可以将它分成另一个类,原始类和其他类都可以依赖它。
答案 1 :(得分:0)
没有。你有一些问题。首先,接口仅描述公共实例方法的签名(即它们可能没有实现,您可能没有在接口中指定静态方法)。扩展方法必须在编译时具有实现,并且它们不是实例方法,它们是静态方法。请注意,根据documentation
在您的代码中,您使用实例方法调用扩展方法 句法。但是,由中间语言(IL)生成 编译器将您的代码转换为静态方法的调用。
换句话说,它不是真正的实例方法(即使你可以像对待它一样); “引擎盖下”它仍然是一种静态方法。
此外,必须在静态类中定义扩展方法(有关如何实现扩展方法,请参阅Microsoft的instructions)。
请注意,可以在接口上使用扩展方法;没有要求你扩展的类型具体。例如:
public static class Class2
{
public static void Extension(this ITestInterface test)
{
Console.Out.WriteLine("This is allowed");
}
}
现在,当我实例化一个实现ITestInterface接口的具体类时,我可以在其上调用扩展方法:
// "Test" is some class that implements the ITestInterface interface
ITestInterface useExtensionMethod = new Test();
useExtensionMethod.Extension();
这可以做你想要的。
答案 2 :(得分:0)
举例来说,对于以下两个类:
class SomeClass
{
public Prop1 { get; }
public void Method1() { .... }
}
static class SomeExtensions
{
public static ExtensionMethod(SomeClass this sc) { ... }
}
正如其他人所说,在创建界面时,您仅限于SomeClass
中的公共非静态成员,但是,还需要修改扩展方法来引用界面,而不是同时具体的类型:
static class SomeExtensions
{
public static ExtensionMethod(ISomeClass this sc) { ... }
}