我可以强制实现类返回自己类型的对象吗?

时间:2009-11-06 15:22:58

标签: c# interface

我想在C#中创建一个接口,定义一个总是返回实现类对象的方法,因此:

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

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

我可以强制实现类返回自己类型的对象吗?如果可能,那么如何?或者泛型是答案吗?

  

NB:代码只是一个例子,而不是那个   应该跑。

4 个答案:

答案 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);
   }
}