2009-11-06 69 views
5

我想在C#中定義,它總是返回實現類的一個對象,因此方法的接口:我可以強制實現類返回它自己類型的對象嗎?

public interface IParser { 
    IParser Parse(string s); 
} 

public class Parser : IParser { 
    public Parser Parse(string s) { 
     return new Parser(s); 
    } 
} 

我可以強制實現的類返回其自身類型的對象?如果可能的話,如何?或者泛型是這裏的答案?

注:的代碼只是一個例子,不是一件 應該運行。

+0

你讓我非常好奇:你爲什麼要這樣做?通常,定義接口的意義在於,客戶端代碼可以相信在對象上定義了某個API,而無需知道或關心該對象的具體類型是什麼。這是面向對象的一大優勢。你通過這樣做試圖完成什麼? –

+0

嗯,我的想法是通過擁有這個接口,你總是可以相信實現這個接口的類將擁有這個方法,並且它們總是會返回它們自己的類型。但正如你所說,這可能不是最好的面向對象設計,我將放棄它來獲得返回接口類型的方法。 – Cros

回答

8

泛型是答案這裏。

public interface IParser<T> where T:IParser<T> { 
    T Parse(string s); 
} 

public class Parser : IParser<Parser> { 
    public Parser Parse(string s) { 
     return new Parser(s); 
    } 
} 
+0

好的工作......我只是測試了我的代碼。 +1 – jheddings

+0

我會立即嘗試。 – Cros

+0

看起來,當你使這個接口是通用的,你必須在你使用ISelection的任何地方指定T作爲你使用的類型的說明符。我現在不能做一個名單,但現在它必須是一個名單>。我對麼?可悲的是,這不是我正在尋找的解決方案。 – Cros

1

是的,這是被稱爲the factory pattern,只是通常這是補充了使用私有的構造和製作實例恢復方法靜態的,例如:

public class Parser : IParser { 

    private Parser(string s) { 
     //Do something with s, probably store it in a field 
    } 

    public static IParser GetNewParser(string s) { 
     return new Parser(s); 
    } 
} 
+0

我認爲關鍵是「......強制執行類返回它自己類型的對象......」 –

+0

這真的不是一個「是/否」的問題。如果可能的話,我想具體知道如何在C#中完成此操作。 – Cros

0

你可以用泛型做到這一點,但我可能會堅持返回一個接口的實例。請注意,由於該類實現了接口,因此返回它的一個實例即可 - 它將成爲該類型和接口的一個實例。

public class Parser : I Parser 
{ 
    public IParser Parser(string s) 
    { 
     return Parser(s); 
    } 
} 
5

不在接口聲明中沒有。你能管理,最好是使用泛型:

public interface IParser<T> 
    where T: IParser<T> 
{ 
    T Parse(string s); 
} 

public class Parser 
: IParser<Parser> 
{ 
    public Parser Parse(string s) 
    { 
     return new Parser(s); 
    } 
} 

這並不實施返回它自己的類型,但至少它允許它這樣做。這就是爲什麼IClonable接口從它的Clone方法返回一個對象,而不是一個特定的類型。

---- ----編輯

東西要記住這樣一個問題:讓我們說,我的代碼,你沒有執行的任何知識,返回一個IParser,和你的代碼調用Parse方法。您希望返回哪個對象,不知道返回的IParser參考的具體類型?我認爲你正嘗試使用接口來實現他們不想做的事情......

+1

提及此技術的+1不會強制執行請求。您可以輕鬆地返回另一個IParser 實現。 AFAIK無法在語言層面強制執行此項檢查;這是你最接近的東西。 –

相關問題