一种接口方法的不同类型实现

时间:2014-08-29 09:54:03

标签: c# generics interface

我正在使用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;
    }
}

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

希望这是有道理的,我真的只是想在这里整洁,因为目前为了使它工作,我需要在我的界面中有两个方法,并让每个类调用一个空方法。

提前致谢,

1 个答案:

答案 0 :(得分: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);
    }
}