2010-10-18 146 views
9
interface IXXX 
{ 
    void Foo(); 
} 

class XXX : IXXX 
{ 
    public static void Foo() 
    { 
     Console.WriteLine("From XXX"); 
    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     XXX.Foo(); 

    } 
} 

编译错误:XXX.Foo()无法实现接口成员,因为它是静态的。静态方法不能实现接口方法,为什么?

为什么静态方法不能实现接口方法?

+0

这没有意义。你将如何在派生类的XXX中实现接口?没有理由你不能从实现中调用静态成员。 – leppie 2010-10-18 08:07:05

+1

http://stackoverflow.com/questions/259026/why-doesnt-c-allow-static-methods-to-implement-an-interface – bernhof 2010-10-18 08:08:27

+0

@leppie,你**可以**有一个“类型的方法”;那里没有隐含的'this',但它确实在运行时从该类型解析了方法。使用它们的罕见场合可以通过实例方法或反射来满足,所以不是迫切需要IMO。 – 2010-10-18 08:12:34

回答

4

接口定义了对象必须响应的行为。 由于Foo是一种静态方法,因此该对象不会对其做出响应。换句话说,你不能写...

XXX myXXX = new XXX(); 
myXXX.Foo(); 

换句话说,myXXX并没有完全满足接口的要求。

2

如果我们看一下作为一个对象可以执行在界面中列出的方法的承诺接口,则静态执行的部份想法变成有问题的。如果这个实现是静态的,那么你就不能写新的ImplementingObject()。ImplementedMethod。该对象不能执行该方法,该类可以。

2

您可以使用接口来避免在实例化过程中使用具体类。您不能通过实例化的类访问静态方法,因此不允许使用静态方法实现接口方法。

0

因为接口成员是公共和重写,而静态方法无法通过设计来overrided或抽象的,接口是这里定义必须通过他们的具体实现方式来实现(与抽象实现&的许多步骤,继承了访问合同接口之间),据我所知,没有办法创建一个抽象的静态方法。

1

那么,我相信它应该允许在泛型类型参数的情况下。它可能简化合同单身班。下面是一个例子:

public interface IEntity { 
    // some constrains... 
    DataRow ObjToRow(object obj); 
    object RowToObj(DataRow dr); 
} 

//T would be any class inherites from IEntity with default contructor signature. 
public interface IMyContract { 
    T read<T>() where T : IEntity; 
    void write<T>(T object) where T : IEntity; 
} 

//everything in the class is static 
public static class SqlProvider : IMyContract { 

    public static T read<T>() where T: IEntity { 
    DataRow dr = [reading from database] 
    return T.RowToObj(dr); 
    } 

    //compile error here.... 
    public static void write<T>(T obj) where T : IEntity { 
    DataRow dr = T.ObjToRow(obj); 

    [ ... commit data row dr to database ... ] 

    } 
} 

public static class MyAppleEntity : IEntity { 
    [... implement IEntity contract normally ... ] 
} 

public static class MyOrangeEntity : IEntity { 
    [... implement IEntity contract normally ... ] 
} 

public class MyTest { 
    void reading() { 
    MyAppleEntity apple = SqlProvider.Read<MyAppleEntity>(); 
    MyOrangeEntity orange = SqlProvider.Read<MyOrangeEntity>(); 

    SqlProvider.write<MyAppleEntity>(apple); 
    SqlProvider.write<MyOrangeEntity>(orange); 
    } 

} 

唯一一次一种类型的参考隐含在SqlProvider.read()和写(),T是在调用的点以及身份。没有接口的静态实现,我不得不像这样写。

public class MyAppleEntity : IEntity { 
    [... implement IEntity contract normally ... ] 
} 

    ..... 

    public T read<T>() where T: IEntity, new() { 
    DataRow dr = [reading from database] 
    return new T().RowToObj(dr); 
    } 

几乎没有什么不同,但没有那么优雅。

+0

我相信这就是函数式语言所说的'函子'。 – 2014-03-24 17:17:01

相关问题