首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载方法还是不重载?

重载方法还是不重载?
EN

Stack Overflow用户
提问于 2011-02-14 23:00:37
回答 6查看 271关注 0票数 4

我这里有两个方法(killZombie),它们处理有一个参数(string)或多个参数(string[])的情况。因为它们做的是相同的事情,所以我创建了另一个名为"killAZombie“的方法,供其他两个方法使用。我遇到的问题是"killAZombie“方法被命名为...嗯,有点奇怪。这是其他人也会遇到的问题吗?解决这个问题的最好方法是什么,并将我的"KillAZombie“方法命名为其他与"killZombie”更清楚地区分开来的方法?

代码语言:javascript
复制
public void killZombie(string zombieLocation){
    killAZombie(zombieLocation);
}

public void killZombie(string[] zombieLocations){
    foreach(string zombieLocation in zombieLocations){
        killAZombie(zombieLocation);
    }
}

public void killAZombie(string zombieLocation){
    //Kills a zombie at specified location
}

我认为解决这个问题的另一种方法是用两种不同的方法来代替重载"killZombie“:

代码语言:javascript
复制
public void killZombie(string zombieLocation){
    //Kills a zombie at specified location
}

public void killZombies(string[] zombieLocations){
    foreach(string zombieLocation in zombieLocations){
        killZombie(zombieLocation);
    }
}

这样,我们只有两个更容易理解的方法,但方法不会被重载。在我看来,重载方法似乎是一件好事(这只是意味着方法更少,杂乱更少),所以我也不确定这个解决方案。我很想知道解决这个问题的最好方法是什么,谢谢!

附录:

我的方法实际上有4个参数,所以参数应该在最后。params变量是最重要的一个,所以把它作为最后一个参数来使params起作用看起来有点笨拙。我关心的是把最重要的参数放在最后,是否足够合理将方法划分为KillZombie和KillZombies,或者参数仍然是正确的方法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-02-14 23:04:51

在这种情况下,您的两个选择中的后一个可能更可取(假设函数的命名意味着它在单个“僵尸”上操作。

但是,您可能还想查看params关键字,以便知道您的选项是什么。例如,如果您简单地将函数命名为Kill (如果在此上下文中这样做是有意义的),您可以这样做:

代码语言:javascript
复制
public void Kill(params string[] zombieNames)
{
    foreach(string name in zombieNames)
    {

    }
}

你可以用很多种方式来称呼它:

代码语言:javascript
复制
Kill("Zoey");
Kill("Francis", "Zoey");

string[] survivors = { "Zoey", "Francis", "Bill", "Louis" };

Kill(names);

(当然,假设你的幸存者都变成了僵尸!)

此外,在风格上,C#代码通常对函数名称使用pascal大小写(KillAZombie而不是killAZombie)。

附录的编辑

是的,参数排序--虽然它与技术无关--是应用程序接口设计中的一个重要考虑因素,因此,如果您打算采用“不太重要”的参数,那么您可能不得不不使用params

话虽如此,我将坚持我最初的建议:由于函数的名称是(KillZombieKill),为了使您的名称与参数保持一致,我会坚持使用两个版本。我还建议允许用户指定IEnumerable<string>而不是数组。这将允许开发人员使用实现IEnumerable<string>的任何东西来传递名称,包括字符串数组。

票数 4
EN

Stack Overflow用户

发布于 2011-02-14 23:07:37

这里有一些想法。

首先,公共方法的C#约定是将它们大写:"KillZombie",而不是"killZombie“。

如果你愿意,你可以用一种方法来完成这项工作。下面是一个获取一个或多个位置的方法。调用者可以只提供一个列表:KillZombies(location1, location2, location3)

代码语言:javascript
复制
private void KillOneZombie(string location) { ... }
public void KillZombies(string location, params string[] additionalLocations)
{
    KillOneZombie(location);
    if (additionalLocations == null) return;
    foreach(string additionalLocation in additionalLocations)
        KillOneZombie(additionalLocation);
}

如果您确实希望有两个方法,请考虑让一个方法接受IEnumerable<string>而不是数组;这样调用者就可以传入列表、查询、数组等等。

您的第二种命名模式更标准: KillZombie和KillZombies。

参数是最重要的一个,所以把它作为最后一个参数来使参数工作似乎有点笨拙。我关心的是把最重要的参数放在最后,是否足够合理将方法划分为KillZombie和KillZombies,或者参数仍然是正确的方法吗?

我会考虑你希望如何使用这种方法。请考虑以下示例:

代码语言:javascript
复制
Console.WriteLine("User: {0} Score: {1}", user[i].Name, scores[i]);

在这里,我们清楚地期望"params“将用于在调用方中支持可变数量的参数。从来没有人这样做过:

代码语言:javascript
复制
object[] results = new object[] { user[i].Name, scores[i] };
Console.WriteLine("User: {0} Score: {1}", results);

尽管这是完全合法的。如果您希望像Console.WriteLine一样使用您的方法,其中将传入不同数量的参数,但参数的数量在编译时是已知的,那么可以使用params。

如果您希望将其用于第二种模式--某人有一个位置数组--那么不要使用参数;创建两个方法KillZombie和KillZombies,并让其中一个接受字符串的IEnumerable。

票数 6
EN

Stack Overflow用户

发布于 2011-02-14 23:04:11

在这种情况下,我可能会采用您的第二个建议。KillZombie杀死一个僵尸;KillZombies杀死多个僵尸。

另一种选择是使用带有params参数的单个方法:

代码语言:javascript
复制
KillZombies("foo");           // kill a single zombie
KillZombies("foo", "bar");    // kill multiple zombies

// ...

public void KillZombies(params string[] zombieLocations)
{
    foreach (string zombieLocation in zombieLocations)
    {
        // kills a zombie at specified location
    }
}

(还要注意,标准的C#命名约定是使用带有大写“K”的KillZombie/KillZombies。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4993653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档