如何创建两个行为不同但接收相同数据类型的构造函数?

时间:2010-06-12 03:04:10

标签: c# .net constructor

public class Parser
{
    Downloader download = new Downloader();
    HtmlDocument Page;

    public Parser(string MovieTitle)
    {
        Page = download.FindMovie(MovieTitle);
    }

    public Parser(string ActorName)
    {
        Page = download.FindActor(ActorName);
    }
}

我想创建一个构造函数,允许其他使用此库的开发人员轻松创建一个Parser对象,并在创建它之后立即加载相关的HtmlDocument。

问题在于构造函数不能以相同类型的参数存在两次。当然可以说明这两个参数之间的逻辑差异,但计算机却不能。

如何处理?

2 个答案:

答案 0 :(得分:18)

使用几个static方法:

public class Parser
{
    Downloader download = new Downloader();
    HtmlDocument Page;

    private Parser() { } // prevent instantiation from the outside

    public static Parser FromMovieTitle(string MovieTitle)
    {
        var newParser = new Parser();
        newParser.Page = newParser.download.FindMovie(MovieTitle);
        return newParser;
    }

    public static Parser FromActorName(string ActorName)
    {
        var newParser = new Parser();
        newParser.Page = newParser.download.FindActor(ActorName);
        return newParser;
    }
}

答案 1 :(得分:4)

在这种特殊情况下,我可能会使用静态方法(我自己很少有公共构造函数),但另一种可能性是使用shim类,这种技术也可以用一种方法来替换带有唯一参数签名的静态方法给他们独特的(并且可能是笨拙的)名字:

public class Parser
{
    Downloader download = new Downloader();
    HtmlDocument Page;

    public Parser(MovieTitle MovieTitle)
    {
        Page = download.FindMovie(MovieTitle);
    }

    public Parser(ActorName ActorName)
    {
        Page = download.FindActor(ActorName);
    }
}

然后您的使用情况为new Parser(new MovieTitle(str))new Parser(new ActorName(str))

如果您正在考虑从ID构建对象,那么这是一个更好的范例。如果你的对象ID有int或Guid,那么构造函数可能需要使用两种不同的“类型”Guids。从完整对象构造的替代方法更安全,并且在传递int时消除了许多愚蠢的错误。在对象之间尽可能不公开内部实现功能是有意义的。