c# - 一种接口(interface)方法的不同类型实现

标签 c# generics interface

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

我找到了一个几乎适合我的问题的解决方案,它是: 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;
    }
}

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

希望这是有道理的,我真的只是想在这里保持整洁,因为目前为了让它工作,我需要在我的接口(interface)中有两个方法并且让每个类调用一个空方法。

提前致谢

最佳答案

您似乎因为糟糕的架构而苦苦挣扎。 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);
    }
}

关于c# - 一种接口(interface)方法的不同类型实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25565866/

相关文章:

c# - 为什么 System.Runtime.InteropServices._Exception 不遵循 .NET 中接口(interface)的标准命名约定?

c# - 如何在事件中心触发Azure函数中获取PartitionId?

java - 泛型类的注释参数

java - Junit 测试用例 AssertionError 预期为 json 字符串

c# - 泛型方法重载和优先级

scala - Seq、SeqLike、GenSeq 还是 GenSeqLike?

c# - FileWatcher 典型实现?

c# - asp :Panel runat ="server" not available in C# . cs 代码页

c# - ConcurrentDictionary<(枚举 a, 枚举 b), T>?

动态语言界面?