C#接口的实现中不能有static,但有个疑问
《C#高级编程》(中文第七版),p107,4.4接口这一节里说到
"接口成员总是公有的,不能声明为虚拟或静态。如果需要,就应由实现的类来声明,因此最好实现执行的类来声明访问修饰符,就像本节的代码那样。"
但是
namespace _1413_接口
{
public class Program
{
static void Main(string[] args)
{
MyClass.fun();
}
}
interface IMyInterface
{
int fun();
}
class MyClass: IMyInterface
{
public static int fun()
{
Console.WriteLine("hello");
return 0;
}
}
}
编译过不了,说没有实现接口的方法。
我看到别人说:
“
abstract 就是为了让其他继承
static 属于类的 不是对象的继承没有意义
abstract关键字和static关键字不能一起使用(在同一个方法或者同一个类上)
”
但是我觉得接口的实现应该是可以为static的,因为我这里是实现,不是接口的声明,不会再有派生了,可是编译就是过不了。
但是我可以在MyClass中定义fun为virtual,这一点和书上说的不冲突,请问static到底有什么问题,为什么实际和书上不一致。
------解决方案--------------------静态方法无法被继承。
所以你生命的静态方法不是实现接口的声明的!
------解决方案--------------------是书本写的有点点奇异,应该是:
在接口定义中还不允许声明关于成员的修饰符。接口成员总是公有的,不能声明为虚拟或静态。
如果需要,就应由实现的类来
控制修饰符。
这样好些。其实关于接口更多的把它理解成一种协议规定,比如电脑USB接口,这个已经定义好了,但是具体的驱动还是各个厂商不同,如果你可以把它设成“静态”的,那这个接口就一个实现了,也就没有意义了。