2012-01-20 74 views

回答

14

不,你不能在C#中做到這一點 - 但通常替代設計方法是使用委託代替。在這個例子中,你已經給了,Runnable通常使用ThreadStart表示,你可以使用匿名方法或lambda表達式:

ThreadStart start =() => 
{ 
    // Do stuff here 
}; 

或者,如果你只需要運行一個方法,用正確的簽名,可以使用方法組轉換:

ThreadStart start = MethodToRunInThread; 

還是在Thread構造函數調用:

Thread t = new Thread(MethodToRunInThread); 
t.Start(); 

如果您真的需要實現一個接口,你必須真正實現它(可能在一個私人嵌套類)。然而,根據我的經驗,這在C#中並不常見 - 通常情況下,即使在Java中,C#接口也是一種自然需要「真正」實現的類型。

+1

這是我不時想念的功能,特別是因爲我的界面通常很窄(角色界面)並且遵循界面隔離原則。當我可以在我的DI配置中註冊一個委託時,它會很方便,而應用程序的其餘部分仍然可以依賴於該接口(而不是'Func '),而不必創建某種類型的包裝該委託的代理類並實現該接口。 – Steven

6

正如Jon指出的,在C#中這是不可能的。

C#中的一種替代模式是使用工廠和委託的組合來允許實現一個接口。本質上,工廠接受每個接口方法的委託並將它們用作後臺實現。例如,這裏有一個IComparable<T>的版本。

public static class ComparableFactory { 
    private sealed ComparableImpl<T> : IComparable<T> { 
    internal Func<T, T, int> _compareFunc; 
    public int Compare(T left, T right) { 
     return _compareFunc(left, right); 
    } 
    } 
    public IComparable<T> Create<T>(Func<T, T, int> compareFunc) { 
    return new ComparableImpl<T>() { _compareFunc = compareFunc }; 
    } 
} 

... 

IComparable<Person> impl = CompareableFactory.Create<Person>(
    (left, right) => left.Age.CompareTo(right.Age)); 
+0

非常酷,+1!但作爲一種良好的做法,最好只推出命名的類。 – nawfal