如何创建两个构造函数重载,两者都只占用一个字符串参数?

时间:2011-02-15 05:33:10

标签: c# .net constructor

例如,您希望使用文件路径和字符串以两种方式初始化对象。通常,两个构造函数都应该使用一个字符串参数MyObject(string file)MyObject(string content),但是不可能以这种方式重载。你有什么建议?

编辑:在第一种情况下,还需要文件路径,因此请不要建议读取文件内容的解决方案,只需将内容传递给其他构造函数。

7 个答案:

答案 0 :(得分:15)

我不是C#程序员,但这似乎是static factory method模式的工作:

class MyObject {
  public static MyObject FromContent(string content) {
    return new MyObject(content);
  }

  public static MyObject FromFile(string path) {
    return new MyObject(ReadContentFromFile(path));
  }
}

然后你可以做

MyObject object = MyObject.FromFile("/some/path");

比使用常规构造函数更具可读性。

答案 1 :(得分:10)

也许您可以更改第一个接受FileInfo而不是:

class MyObject
{
    public MyObject(FileInfo file) { /* etc... */ }
    public MyObject(string content) { /* etc... */ }
}

...

MyObject o = new MyObject(new FileInfo(filename));

答案 2 :(得分:1)

或创建工厂方法:

public static MyObject CreateByFilePath(string path){ ... }
public static MyObject CreateByContent(string content){ ... }

答案 3 :(得分:1)

也许你可以使用工厂?

class MyObjectProvider
{
   public static MyObject CreateByPath(string path) 
   { 
      return new MyObject
              {
                  Path = path;
              };

   }

   public static MyObject CreateByContent(string content) 
   { 
      return new MyObject
              {
                  Content = content;
              };
   }
}

答案 4 :(得分:1)

答案 5 :(得分:0)

public MyObject(Uri fileUri);
public MyObject(string content);

答案 6 :(得分:0)

我会采取逆向的方式并说不要这样做。到目前为止发布的最佳解决方案(使用FileInfo或Uri之类的替代类型进行其中一次重载)对我来说似乎有些苛刻 - 违背了最不惊讶的原则。

如果你可以只使用没有文件名的内容来构建,那么文件名就不是必需的了。同样,如果您可以使用文件名构建,那么内容不是必需的。据推测,您可以稍后设置丢失的文件名/内容,例如通过设置属性:

MyObject myObject = new MyObject(fileName);
myObject.Content = ...

MyObject myObject = new MyObject(content);
myObject.FileName = ...

不要试图对抗它,而是选择一个参数作为最重要的参数(以下示例中的fileName),并按如下方式创建两个构造函数:

public MyObject(string fileName) : this(fileName, null)
{
}

public MyObject(string fileName, string content)
{
    ... implementation
}

如果有意义,您可以允许为其中一个或两个参数传递null。你可以坚持认为,如果合适,至少有一个不为空:

public MyObject(string fileName, string content)
{
    if (fileName == null && content == null) throw new ArgumentException(...);
    ...
}    

简而言之,不要使用黑客来解决这样的限制。