不确定这是否是一个愚蠢的问题,但我只是注意到了这一点:
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)
{
}
}
Run Code Online (Sandbox Code Playgroud)
在我的实现中,我调用了第二个参数'maxRecords'.然而,在界面中,它被定义为"计数".编译器仍然认为接口已实现,这很好,但可能会导致一些歧义.显然,我应该重命名其中一个参数以匹配另一个参数.
在重命名之前我玩了一下,发现了一些有趣的东西.我不允许将我的界面声明为:
public interface IActivityDao : IDao<Activity>
{
IList<Activity> GetAllSinceSequence(long, int);
}
Run Code Online (Sandbox Code Playgroud)
这只是编译器对C#语义的过度保护吗?除了使代码更具可读性之外,接口方法中的参数名称的用途是什么?在我看来,如果在实现时不强制参数名称,它会引起歧义.
use*_*940 30
接口声明中需要参数名称,以便于实现和参考.如果有人使用您的界面,方法参数的名称应该是自我记录,因此界面的使用者了解传递给方法的内容(例如,通过IntelliSense查看方法描述时)
是的,当您实现界面时,您可以根据需要为参数命名.
历史.这可以追溯到.NET的早期阶段,当COM统治世界时.当时能够与COM互动是非常重要的,没有人会抛弃一切来采用全新的编程风格.
这使得COM互操作在.NET中得到了强有力的支持.除了需要为接口方法设置命名参数之外,类型库还需要它们.
有趣的角落案例永远是C++/CLI语言.它采用了许多C++语法规则,包括在声明中省略参数名称的能力.换句话说,这是合法的:
public interface class IFoo
{
void bar(int, long, double);
};
Run Code Online (Sandbox Code Playgroud)
类型库导出器生成此声明:
HRESULT bar(
[in] long p1,
[in] long p2,
[in] double p3);
Run Code Online (Sandbox Code Playgroud)
如果您在C#类中实现接口,则由IntelliSense自动生成,结果非常相似:
class FooImpl : cpptemp36.IFoo {
public void foo(int __p1, int __p2, double __p3) {
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
这让没人高兴.