具有相似类型的重载方法

时间:2014-05-30 10:21:20

标签: c# overloading

我在MSDN上看过this文章,我的眼睛抓住了这个:

“不要在同一位置和类似类型的参数重载,但语义不同。”

我有一个有2个重载的方法:

public bool myMethod(MyObject obj, Guid user)
public bool myMethod(MyObject obj, Guid group)

这里的要点是我的方法将对象的访问权限授予组或用户。由于指南在这里被违反,我想知道我的方法是否足够好还是我应该定义一种新方法(或第三种方法)?

4 个答案:

答案 0 :(得分:3)

您的选择是:

重命名方法

这是我的建议。

public bool myMethodByUser(MyObject obj, Guid user)
public bool myMethodByGroup(MyObject obj, Guid group)

更改参数类型

将Guids提取到他们自己的班级。在这种情况下可能有些过分,但您可能已经拥有UserGroup的这些对象。

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不允许你编译你的程序,你需要更改方法名称,或者你必须在你的任何一个方法中添加一个参数。

相关问题