日期:2014-05-17  浏览次数:20980 次

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接口,这个已经定义好了,但是具体的驱动还是各个厂商不同,如果你可以把它设成“静态”的,那这个接口就一个实现了,也就没有意义了。