2013-03-02 93 views
2

這可能是最好的例子。接口中的函數返回任何類實現它的類型的對象

我有兩個結構:狗和貓,它們都屬於IAnimal。

IAnimal有一個函數ConvertFrom(IAnimal),它將任何從IAnimal繼承的對象轉換爲與調用函數相同的類型。

例如爲:

我打電話Dog.ConvertFrom(貓)和我從貓映射在田野中的狗。

我打電話給Cat.ConvertFrom(狗),我得到一隻貓,從狗映射過來的字段。

有什麼辦法可以用接口做到這一點?指定函數必須返回與實現該函數的類相同的類型?

我想簡單地寫它:

IAnimal ConvertFrom(IAnimal) 

但我寧願可以指定它要回來的狗或貓,而不是作爲IAnimal(從而減輕進一步投)。

+0

只是讓我知道你要問什麼。你問是否靜態方法,即。 'Dog.ConvertFrom'可以通過接口實現嗎? – 2013-03-02 20:23:44

+0

「狗」和「貓」是否有兼容的字段?如果是這樣,你只會使用'狗'和'貓'嗎?當你說'Dog.ConvertFrom(cat)'是'ConvertFrom'一個靜態方法或實例方法。如果你想優雅地做事情,我會首先建議你停止變異的事情,並採取不變的+功能範例的路線... – 2013-03-02 20:36:04

+0

他們有一些兼容的領域,但不是所有的兼容。我計劃隨着時間的推移將IAnimal擴展到包括其他人,這將需要轉化。目前我使用各種接口來顯示每隻動物所支持的內容(例如,ICoat,速度等),並可以使用它們進行轉換。對於這是一個真實的例子,它是針對Direct3D頂點類型的,它們由着色器指定,但通常對象被存儲爲一種類型的頂點,所以這些轉換需要存在,並且需要是可擴展的。 – 2013-03-02 20:39:52

回答

6

您可能會在討論類似Curiously Recurring Template Pattern的內容以實現靜態多態性。 你可以使用泛型有:

public interface IAnimal 

public interface IAnimal<T> : IAnimal where T : IAnimal<T> 

public class Dog : IAnimal<Dog> 

public class Cat : IAnimal<Cat> 

然後你的方法變得像:

T ConvertFrom(IAnimal someAnimal) 
+0

這似乎爲我工作,謝謝 – 2013-03-02 20:32:42

相關問題