例如,您希望使用文件路径和字符串以两种方式初始化对象。通常,两个构造函数都应该使用一个字符串参数MyObject(string file)
和MyObject(string content)
,但是不可能以这种方式重载。你有什么建议?
编辑:在第一种情况下,还需要文件路径,因此请不要建议读取文件内容的解决方案,只需将内容传递给其他构造函数。
答案 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(...);
...
}
简而言之,不要使用黑客来解决这样的限制。