我在MSDN上看过this文章,我的眼睛抓住了这个:
“不要在同一位置和类似类型的参数重载,但语义不同。”
我有一个有2个重载的方法:
public bool myMethod(MyObject obj, Guid user)
public bool myMethod(MyObject obj, Guid group)
这里的要点是我的方法将对象的访问权限授予组或用户。由于指南在这里被违反,我想知道我的方法是否足够好还是我应该定义一种新方法(或第三种方法)?
答案 0 :(得分:3)
您的选择是:
重命名方法
这是我的建议。
public bool myMethodByUser(MyObject obj, Guid user)
public bool myMethodByGroup(MyObject obj, Guid group)
更改参数类型
将Guids提取到他们自己的班级。在这种情况下可能有些过分,但您可能已经拥有User
和Group
的这些对象。
public bool myMethod(MyObject obj, User user)
public bool myMethod(MyObject obj, Group group)
更改参数订单
这是一个非常讨厌的黑客,我只提到它,因为它可以做到。这样做会使调用者感到困惑并违反您发布的指南。另外,如果您需要第三种方法,例如传递角色Guid
?
public bool myMethod(MyObject obj, Guid user)
public bool myMethod(Guid group, MyObject obj)
答案 1 :(得分:2)
如果有人在这样的对象上调用.myMethod(new MyObject(), new Guid())
,您会发生什么?编译器如何知道该怎么做?
你无法回答这个问题,编译器也没办法。
使用方法重载是因为两个方法在他们所做的事情上足够相似,具有相同名称的方法有助于人类理解,尽管他们使用不同的参数执行该任务。如果他们基本上没有做同样的事情,他们应该有不同的名字,所以人们编写使用它们的代码将知道每个人做什么。如果他们确实做了同样的事情,那么你就不需要两种这样的方法。
你可以反转一个参数的顺序,使它们分明,但这将是一个非常糟糕的主意,因为它不会成为通过查看调用代码来清楚哪个。
你最擅长的是:
public bool MyMethodByUser(MyObject obj, Guid user)
{
/* ... */
}
public bool MyMethodByGroup(MyObject obj, Guid group)
{
/* ... */
}
或者(或许更好)类似的东西:
public bool MyMethod(MyObject obj, User user)
{
Guid userID = user.Guid;
/* ... */
}
public bool myMethod(MyObject obj, Group group)
{
Guid groupID = group.Guid;
/* ... */
}
因此,用户和组由不同类型表示。
答案 2 :(得分:0)
目前您的代码包含语法错误。您不能以相同的顺序重载具有相同参数类型的方法。您只能通过更改顺序或参数或参数数量来重载具有不同类型的方法
答案 3 :(得分:0)
目前你有相同的方法名称和相同的arugement,所以IDE不允许你编译你的程序,你需要更改方法名称,或者你必须在你的任何一个方法中添加一个参数。