当前位置: 首页 > 知识库问答 >
问题:

为什么接口定义中需要参数名?我可以在实现过程中选择新的参数名

笪煌
2023-03-14

不确定这是不是一个愚蠢的问题,但我注意到:

public interface IActivityDao : IDao<Activity>
{
    IList<Activity> GetAllSinceSequence(long sequence, int count);
}

public class ActivityDao : AbstractNHibernateDao<Core.Domain.Activity>, IActivityDao
{        
    public IList<Activity> GetAllSinceSequence(long sequence, int maxRecords)
    {

    }
}

在我的实现中,我将第二个参数称为maxRecords。然而,在接口中,它被定义为“计数”编译器仍然考虑实现的接口,这很好,但是会导致一点歧义。显然,我应该重命名其中一个参数以匹配另一个。

在重新命名之前,我玩了一会儿,发现了一些有趣的东西。我不允许将我的接口声明为:

public interface IActivityDao : IDao<Activity>
{
    IList<Activity> GetAllSinceSequence(long, int);
}

这只是编译器对C#symantics的过度保护吗?接口方法中的参数名除了使代码更具可读性之外还有什么用途?在我看来,如果参数名不是强制实现的,那么它会引起歧义。

共有3个答案

池兴邦
2023-03-14

我问你,世界上还有其他地方吗。net框架,允许您定义无参数名称的方法签名?

归根结底,所有事情都是可能的,但大多数事情都是有原因的,在这种情况下,我认为这是框架和编译器设计的一个限制,这真的很重要吗?

毕竟,您正在定义一个合同以供使用,人们会期望它们真的存在。

钮兴安
2023-03-14

历史这可以追溯到人类文明的早期。NET,当COM统治世界时。能够与COM进行互操作在当时是非常重要的,没有人会为了采用一种全新的编程风格而放弃一切。

这使得中的COM互操作受到强烈支持。NET。除了需要有接口方法的命名参数外,类型库也需要它们。

有趣的是C/CLI语言。它采用了许多C语法规则,包括在声明中省略参数名的能力。换句话说,这是合法的:

    public interface class IFoo
    {
        void bar(int, long, double);
    };

类型库导出器生成以下声明:

    HRESULT bar(
                    [in] long p1, 
                    [in] long p2, 
                    [in] double p3);

如果在C#类中实现由IntelliSense自动生成的接口,结果非常相似:

class FooImpl : cpptemp36.IFoo {
    public void foo(int __p1, int __p2, double __p3) {
        throw new NotImplementedException();
    }
}

这让任何人都不开心。

傅志文
2023-03-14

为了清晰的实现和参考,接口声明中需要参数名称。如果有人在使用你的接口,方法参数的名称应该是自文档化的,这样接口的消费者就知道要传递什么给方法(例如,通过智能感知查看方法描述时)

是的,当您实现接口时,您可以随意命名参数。

 类似资料:
  • 问题内容: 创建接口方法时,我们不能像在 java中 那样做: 相反,我注意到我们还需要给参数名称lile: 同样,接口实现者不需要具有与接口方法中相同的参数名称。 我在这里发现了有关c#的类似问题。他们提到了 命名参数的一种情况,但是我没有在Java中找到任何其他相关原因。 问题答案: 从技术角度来看,这是没有必要的。 我一直将其作为语法规范化和文档帮助。 这样有: 没有理由区分类和接口方法的语

  • 问题内容: 我在课堂上有这个功能: 我尝试使用此函数来调用该函数: 问题是编译器希望它看起来像这样: 为什么第一个会导致错误? 问题答案: Swift 2.0更新 :现在,默认情况下,函数的功能与方法相同,并且对于两种方法而言: 第一个参数没有外部名称;和 其他参数的外部名称与内部名称相同。 除此之外,下面的规则仍然适用,只是速记语法已消失。 这是一个更一般的答案:函数在类之外定义为真函数时以及在

  • 我正在阅读有关java中的同步概念的信息,并遇到了同步语句。 我想知道,为什么我们向它传递参数,尽管它看起来像静态块(这只是一个例子),并且传递的参数没有指定任何数据类型。 例: 如果有人知道,请解释。

  • 问题内容: 在Golang中,我们将结构体与接收器方法结合使用。到这里为止一切都很完美。 我不确定什么是接口。我们在结构中定义方法,如果要在结构上实现方法,则无论如何都要在另一个结构下再次编写该方法。 这意味着接口似乎只是方法定义,仅占用了页面上多余的空间。 有没有解释我为什么需要接口的示例? 问题答案: 接口太大了,不能在这里给出全面的答案,但是有些事情需要弄清楚它们的用途。 接口是一种 工具

  • 问题内容: 命名函数的返回参数有什么好处? 问题答案: 命名它们有一些好处: 它用作文档。 它们会自动声明并初始化为零值。 如果您有多个返回站点,则更改函数的返回值并不需要全部更改,因为它只会显示“ return”。 还有缺点,主要是很容易通过声明相同名称的变量来意外地遮盖它们。 有效的Go中有一个关于命名结果参数的部分: 可以给Go函数的返回或结果“参数”指定名称,并将其用作常规变量,就像传入参

  • 例如,我在语法中定义了几个lexer规则: 我需要以某种方式标记关键字(“int”、“float”和其他),当我使用TokenStream获取令牌时,我可以通过一些自定义符号对其进行过滤。 有可能吗? 现在我只看到一种方法——将必要的词汇组合成某种规则。 使现代化 我尝试应用下面第一个答案的第一个选项,但遇到了下一个问题:我得到一个错误:“TOKENNAME不是可识别的令牌名称” 因为这是一个问题