为什么不能这样实现接口

时间:2018-06-08 13:59:04

标签: c#

我需要在SendAsync方法的签名中添加一个变量,但是当我尝试这样做时,我得到一个错误,我需要实现接口匹配SendAsync而没有新变量。

我可以同时拥有两个吗?我想我试图重载接口。

以下代码。

public class EmailService : IIdentityMessageService 
{
    public async Task SendAsync(IdentityMessage message, string OAEmailAddress)
    {
        await configSendGridasync(message, OAEmailAddress);
    }
}

3 个答案:

答案 0 :(得分:1)

界面是合约,您必须完全填写 。特别是客户应该如何知道何时使用两个以及何时只使用一个参数?想象一下,你有一个接口IMyInterface,其唯一的方法DoSomething没有任何参数:

IMyInterface instance = getInstance();
instance.DoSomething();

没有一个实现该接口的类:

class MyClass : IMyInterface
{
    public void DoSomething(string arg1, string arg2) { ... }
}

您要知道的是,instance属于IMyInterface类型DoSomething - 方法不期望任何。您的界面用户应该如何知道实际类型(在这种情况下为MyClass)但是需要更多参数来调用该方法?事实上,他甚至不知道getInstance甚至返回了MyClass类型的实例,它也可能是实现该接口的任何其他类。

这就是存在接口的原因:他们清楚地说明了你可以用一个实例做什么以及如何做到这一点。超出此范围的一切都需要对该界面进行一些扩展,例如通过在该接口中使用另一种方法,或通过使用第二个接口扩展接口。

答案 1 :(得分:1)

接口是一个规范,意味着任何实现必须至少提供指定的那些功能。您可以自由地实现更多指定的功能。

答案 2 :(得分:1)

此方法存在于接口中,声明(“签名”)必须在类和接口之间匹配,因此只有几个选项:

  • 在类和界面中(以及使用该界面的任何地方)添加参数,
  • 在课堂上制作第二个方法。这可能是重载或具有不同名称的方法。

如果添加方法,则 不会通过接口公开。如果您需要它,并且它对您有意义,您可以将第二种方法添加到同一个接口,或者添加到不同的接口(一个类可以实现多个接口),或者根本不添加任何接口。