在签名相关但不相同的接口之间进行转换是否是一种反模式?

is it an anti-pattern to cast between interfaces that are related but not identical regarding the signatures?

首先,我不熟悉针对抽象进行编程的概念。

假设我有以下内容:

public interface IEmail {}

public interface IEmailWithAttachments : IEmail
{
    List<Attachment> Attachments {get; set;}
}

public interface IService
{
    void Send(IEmail email);
}

EmailService class 发送 IEmail 类型的通知,为此它使用 SmtpClient,它只能发送 MailMessage 类型的对象,这就是为什么我使用工厂来 return 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;
    }
}

OR 我应该创建另一个处理 IEmailWithAttachments 类型的工厂方法吗?

提前致谢

就我个人而言,我看不出 IEmailWithAttachments 是一个独立于 IEmail 的界面,因为它对零附件的电子邮件有效。如果将这两个界面结合起来,那么希望避免转换的设计问题就不再是问题了。