2013-03-02 90 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

相关问题