具有相似类型的重载方法

本文关键字:重载 方法 类型 相似 | 更新日期: 2023-09-27 18:05:58

我在MSDN上读了这篇文章,我注意到了这一点:

"不要重载位置相同、类型相似但语义不同的参数。"

我有一个方法有两个重载:

public bool myMethod(MyObject obj, Guid user)
public bool myMethod(MyObject obj, Guid group)
这里的要点是,我的方法将对象的访问权授予组或用户。既然这里违反了指导原则,我想知道我的方法是否足够好,或者我应该定义一个新方法(或第三种选择)?

具有相似类型的重载方法

您的选择是:

<<p> 重命名方法/strong>

这是我的建议。

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

更改参数类型

将指南提取到它们自己的类中。在这种情况下可能会过度使用,但您可能已经为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)

如果有人在这样一个对象上调用.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;
   /* ... */
}

目前你有相同的方法名和相同的参数,所以IDE将不允许你编译你的程序,要么你必须改变方法名,要么你必须在任何一个方法中添加一个参数

当前您的代码包含语法错误。不能以相同的顺序用相同的参数类型重载一个方法。你只能用不同的类型重载一个方法,通过改变顺序、参数或者参数的数量