【问题标题】:Different type implementations of one interface method一种接口方法的不同类型实现
【发布时间】:2023-10-04 04:17:01
【问题描述】:

我正在使用 c# 尝试实现 2 个使用相同接口的类。 这两个类只需要一个方法。 然而,这两种方法需要是不同的类型,采用不同的参数。 我真的希望能够从接口继承一个方法并在每个类中覆盖它,因为这会很好而且整洁(接口对于程序功能是必需的(使用依赖注入)) 不幸的是,这两个类也是必需的,因为电子邮件发件人类将在其他程序中重复使用。

我找到了一个几乎适合我的问题的解决方案,它是: Implementing methods from an interface but with different parameters

我的不同之处在于我的两个类中的每一个都应该只调用一个方法。

这是我的代码(尝试在之前的解决方案中实现泛型):

interface IEmailSender<T>
{
     T DoEmail();
}

public class EmailGenerator : IEmailSender<MailMessage>
{
     public override MailMessage DoEmail(string emailAddress)
     {
         MailMessage message = new MailMessage();
         //code to generate email message
         return message;
     }
}

public class EmailSender : IEmailSender<bool>
{
    public override bool DoEmail(MailMessage message)
    {
        //code to send email
        return true;
    }
}

理想情况下,我希望我的电子邮件发件人方法无效,但如果它必须具有返回值,我不介意它返回一个布尔值。

希望这是有道理的,我实际上只是想在这里保持整洁,因为目前为了使其工作,我需要在我的接口中有两个方法并让每个类调用一个空方法。

提前致谢,

【问题讨论】:

  • 你能解释一下为什么这两个类应该“共享”相同的接口吗?他们似乎没有做类似的事情,是吗?
  • 我最初想要一个“电子邮件”接口来处理处理电子邮件的两个类。如果没有办法做到这一点,那么我将不得不将它们分开。

标签: c# generics interface


【解决方案1】:

您似乎因为糟糕的架构而苦苦挣扎。 EmailGenerator 不是 IEmailSender。绝对不会将其用作IEmailSender

我会推荐这个:

interface IEmailGenerator{
    MailMessage BuildMailMessage(string message)
}

interface IEmailSender
{
    void SendEmail(string message);
}

public class EmailGenerator : IEmailGenerator{
     public MailMessage BuildMailMessage(string message)
     {
          return new MailMessage();
     }
}

public class EmailSender : IEmailSender
{
     private readonly IEmailGenerator _emailGenerator;

     public EmailSender (IEmailGenerator emailGenerator){
        _emailGenerator = emailGenerator;
     }

     public void SendEmail(string message)
     {
          var message = _emailGenerator.BuildMailMessage(message);

          //send email
     }
}

通过这种方式,您可以清楚地区分发送电子邮件和生成电子邮件之间的区别(和关注点)。您可以使用 DI 将所有内容连接在一起:

class Consumer{
    private IEmailSender _emailSender;

    Consumer(IEmailSender emailSender){ _emailSender = emailSender;}

    void Method()
    {
        string msg = "Hello Wolrd!"
        _emailSender.SendEmail(msg);
    }
}

【讨论】:

  • 好的,非常感谢。我曾认为将两者都放入一个界面可能是不可能的!我会看看这是怎么回事。
最近更新 更多