2010-10-18 272 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