我想在C#中创建一个接口,定义一个总是返回实现类对象的方法,因此:
public interface IParser {
IParser Parse(string s);
}
public class Parser : IParser {
public Parser Parse(string s) {
return new Parser(s);
}
}
我可以强制实现类返回自己类型的对象吗?如果可能,那么如何?或者泛型是答案吗?
NB:代码只是一个例子,而不是那个 应该跑。
答案 0 :(得分: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);
}
}
答案 1 :(得分: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
引用的具体类型?我认为你正试图将接口用于他们不应该做的事情......
答案 2 :(得分: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);
}
}
答案 3 :(得分:0)
您可以使用Generics执行此操作,但我可能会坚持返回接口的实例。请注意,由于该类实现了接口,因此返回它的实例是可以的 - 它也将是该类型和接口的实例。
public class Parser : I Parser
{
public IParser Parser( string s )
{
return Parser(s);
}
}