这可能是关于基本设计的问题。
我想对mystery对象执行操作,只要它实现我的接口IMyInterface。我希望interace定义的方法之一能够返回一个神秘对象的实例......
IMyInterface
{
object GetInstance();
}
public class MysteryObject : IMYInterface
}
public object GetInstance()
{
MysteryObject instance = new MysteryObject();
return instance;
}
}
但这会导致不必要的“对象”类型以及与之相关的开销。 C#特别使用泛型类型来消除这种开销。做这样的事情是理想的:
IMyInterface
{
T GetInstance<T>();
}
public class MysteryObject : IMYInterface
}
public MysteryObject GetInstance<MysteryObject>()
{
MysteryObject instance = new MysteryObject();
return instance;
}
}
我知道第二个例子不起作用。我知道语法错了。 ..但我想知道是否有更好的方法来要求实现IMyInterface的对象返回它自己类型的实例。
我的例子有点奇怪,但我认为大多数人会理解这种情绪。奇怪的是,我发现很少有这方面的例子或问题。
答案 0 :(得分:4)
您只需输入返回类型IMyInterface
:
public interface IMyInterface
{
IMyInterface GetInstance();
}
public class MysteryObject : IMyInterface
{
public IMyInterface GetInstance()
{
MysteryObject instance = new MysteryObject();
return instance;
}
}
或者使用泛型:
public interface IMyInterface<T>
{
T GetInstance();
}
public class MysteryObject : IMyInterface<MysteryObject>
{
public MysteryObject GetInstance()
{
MysteryObject instance = new MysteryObject();
return instance;
}
}
如果您希望泛型参数的类型为IMyInterface,则可以添加如下约束:
public interface IMyInterface<T>
where T : IMyInterface<T>
{
T GetInstance();
}
<强>更新强>
以下是一些示例用法,以了解这两个版本之间的区别:
返回界面IMyInterface
:
IMyInterface a = new MysteryObject().GetInstance(); // valid
MysteryObject b = new MysteryObject().GetInstance();// invalid
MysteryObject b = (MysteryObject)new MysteryObject().GetInstance(); // valid
从界面返回泛型类型参数:
IMyInterface<MysteryObject> a = new MysteryObject().GetInstance(); //valid
MysteryObject b = new MysteryObject().GetInstance(); //valid
答案 1 :(得分:2)
你几乎拥有它。您需要使整个界面通用:
IMyInterface<T>
{
T GetInstance();
}
public class MysteryObject : IMYInterface<MysteryObject>
}
public MysteryObject GetInstance()
{
MysteryObject instance = new MysteryObject();
return instance;
}
}