Tot*_*oto 28 c# generics inheritance static interface
有没有一种简单的方法来实现它,如果可能的话,不需要实例化对象:
interface I
{
static string GetClassName();
}
public class Helper
{
static void PrintClassName<T>() where T : I
{
Console.WriteLine(T.GetClassName());
}
}
Run Code Online (Sandbox Code Playgroud)
Kei*_*ith 25
请尝试使用扩展方法:
public interface IMyInterface
{
string GetClassName();
}
public static class IMyInterfaceExtensions
{
public static void PrintClassName<T>( this T input )
where T : IMyInterface
{
Console.WriteLine(input.GetClassName());
}
}
Run Code Online (Sandbox Code Playgroud)
这允许您添加静态扩展/实用程序方法,但您仍需要IMyInterface实现的实例.
你不能拥有静态方法的接口,因为它没有意义,它们是没有实例的实用方法,因此它们实际上没有类型.
您不能继承静态方法.您的代码不会以任何方式编译,因为接口因此而无法使用静态方法.
引自littleguru:
.NET中的继承仅适用于实例库.静态方法是在类型级别上定义的,而不是在实例级别上定义的.这就是为什么覆盖不适用于静态方法/属性/事件...
静态方法只在内存中保存一次.没有为它们创建的虚拟表等.
如果在.NET中调用实例方法,则始终为其提供当前实例.这是.NET运行时隐藏的,但它确实发生了.每个实例方法都将第一个参数作为运行该方法的对象的指针(引用).静态方法不会发生这种情况(因为它们是在类型级别定义的).编译器应该如何决定选择要调用的方法?