题
我有一个人目的有两个构造一个int(personId),另一个string(logonName).我想另一个构造,需要一个string(badgeNumber).我知道这不可能做到,但是似乎它可能是一个共同的情况。是否有一个优雅的方式处理这个吗?我想这也适用于任何超载方法。代码:
public class Person
{
public Person() {}
public Person(int personId)
{
this.Load(personId);
}
public Person(string logonName)
{
this.Load(logonName);
}
public Person(string badgeNumber)
{
//load logic here...
}
...等。
解决方案
你可以考虑使用定义的类型。
例如,创建LogonName和BadgeNumber课程。
那么你的功能的声明看起来像...
public Person(LogonName ln)
{
this.Load(ln.ToString());
}
public Person(BadgeNumber bn)
{
//load logic here...
}
这样的解决方案可能会给你一个很好的地方保持商业逻辑规定的格式和使用这些字符串。
其他提示
你也许可以用工厂的方法,而不是?
public static Person fromId(int id) {
Person p = new Person();
p.Load(id);
return p;
}
public static Person fromLogonName(string logonName) {
Person p = new Person();
p.Load(logonName);
return p;
}
public static Person fromBadgeNumber(string badgeNumber) {
Person p = new Person();
// load logic
return p;
}
private Person() {}
你有四个选项,我可以认为,三个已经被命名为其他人:
去工厂的路线,因为建议的其他几个人在这里。一个缺点是,你不能拥有致命名经过载(否则你会有同样的问题),因此它是表面上较不干净。另一个较大的缺点是,它排除了可能分配直接在栈。一切都将被分配在堆如果你采取这种做法。
定义的目的包装。这是一个很好的方法,和一个我会建议如果你是从零开始。如果你有一个很大的代码使用,例如,徽章为弦,然后重写代码可以使这个非可行的选择。
添加枚举的方法,指定如何对待。这一工作,但是要求你写的所有现有呼叫,包括新列举的(虽然可以提供一种默认,如果希望避免一些此)。
添加一个虚拟参数,也就是未使用的区分两个重载。例如粘着一个
bool
上述的方法。之所以采取这种做法是为了通过标准图书馆在一些地方,例如std::nothrow
是一个虚拟参数operator new
.这个缺点的办法是,这是丑陋的,它无法扩展。
如果你已经有了一个大基地的现有编码,我建议添加枚举的(可能是默认值)或加入虚拟参数。既不是美丽的,但都是相当简单的改造。
如果你是从头开始,或者只有少量的代码,我建议本定义的目的包装。
工厂的方法将是一个选择,如果你有的代码,大量使用的原料 badge
/logonName
串的,但不严重的使用 Person
类。
如果您使用的C#3.0,可以使用 目初始化:
public Person()
{
}
public string Logon { get; set; }
public string Badge { get; set; }
你会打电话的构造是这样的:
var p1 = new Person { Logon = "Steve" };
var p2 = new Person { Badge = "123" };
没有。
你可能会考虑的一个标志的领域(枚举的可读性),然后有的构造使用,您可以将确定什么你的意思。
不会的工作。你可能会考虑一类称为BadgeNumber包装串为了避免这种模糊性。
你可以使用一个静态工厂的方法:
public static Person fromLogon(String logon) { return new Person(logon, null); }
public static Person fromBadge(String badge) { return new Person(null, badge); }
正如已经建议,定义类型的路要走,在这种情况。
我唯一能想到的处理什么你想要做的就是要参数之一,用于描述的参数类型(枚举与LogonName,BadgeNumer,等等)和第二是参数值。
你可以切换到工厂式的模式。
public class Person {
private Person() {}
public static PersonFromID(int personId)
{
Person p = new Person().
person.Load(personID);
return p;
this.Load(personId);
}
public static PersonFromID(string name)
{
Person p = new Person().
person.LoadFromName(name);
return p;
}
...
}
或者,作为建议,使用定义的类型。你也可以破解的东西使用仿制药,但是我不会推荐的可读性。
怎么样...
public Person(int personId)
{
this.Load(personId);
}
public Person(string logonName)
{
this.Load(logonName);
}
public Person(Object badgeNumber)
{
//load logic here...
}