首先,我对抽象编程的概念很陌生。
假设我有以下内容:
public interface IEmail {}
public interface IEmailWithAttachments : IEmail
{
List<Attachment> Attachments {get; set;}
}
public interface IService
{
void Send(IEmail email);
}
EmailService 类发送 IEmail 类型的通知,为此,它使用只能发送 MailMessage 类型对象的 SmtpClient,这就是为什么我使用工厂返回 MailMessage 实例,该实例仅包含传递的 IEmail 对象的属性值。
public class EmailService : IService
{
private IMailMessageFactory _mailMessageFactory;
private ISmtpClient _smtpClient;
public EmailService(ISmtpClient smtpClient, IMailMessageFactory mailMessageFactory)
{
_mailMessageFactory = mailMessageFactory;
_smtpClient = smtpClient;
}
public void Send(IEmail email)
{
using(MailMessage mailMessage = _mailMessageFactory.CreateMailMessageFromNotification(email))
{
_smtpClient.Send(mailMessage);
}
}
}
public interface IMailMessageFactory
{
MailMessage CreateMailMessageFromNotification(IEmail email);
}
public class MailMessageFactory : IMailMessageFactory
{
public MailMessage CreateMailMessageFromNotification(IEmail email)
{
MailMessage mailMessage = new MailMessage();
//copies the IEmail properties to the new created MailMessage instance
return mailMessage;
}
}
问题:
据我所知,IEmailWithAttachment 与 IEmail 是不同的类型,工厂方法是否应该检查传递的 IEmailWithAttachment 类型的 IEmail 对象,以便我可以访问附件列表属性?如下:
public class MailMessageFactory : IMailMessageFactory
{
public MailMessage CreateMailMessageFromNotification(IEmail email)
{
MailMessage mailMessage = new MailMessage();
//copies the IEmail properties to the new created MailMessage instance
IEmailWithAttachment emailWithAttachment = email as IEmailWithAttachment;
if (emailWithAttachment != null)
{
foreach (var attachment in emailWithAttachment.Attachments)
{
mailMessage.Attachments.Add(attachment);
}
}
return mailMessage;
}
}
或者我应该创建另一个处理 IEmailWithAttachments 类型的工厂方法吗?
提前致谢
最佳答案
就我个人而言,我不认为 IEmailWithAttachments
是与 IEmail
不同的接口(interface),因为对于具有零附件的电子邮件来说是有效的。如果将这两个接口(interface)结合起来,那么希望避免强制转换的设计问题就不再是问题了。
关于c# - 在签名相关但不相同的接口(interface)之间进行转换是否是一种反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57524028/