我正在使用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;
}
}
理想情况下,我希望我的电子邮件发件人方法无效,但如果必须有返回值,我不介意返回布尔值。
希望这是有道理的,我真的只是想在这里整洁,因为目前为了使它工作,我需要在我的界面中有两个方法,并让每个类调用一个空方法。
提前致谢,
答案 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);
}
}