以面向对象的方式组合对象属性

本文关键字:对象 属性 组合 方式 面向对象的 | 更新日期: 2023-09-27 18:08:44

我有一种情况,我必须发送邮件a,有时我必须发送邮件B,但也有一种情况,我想发送由邮件a和邮件B的组合组成的邮件。

例如,邮件A的主题是'邮件A的主题'。邮件B的主题是"这是邮件B的主题"。现在我的情况是,我想把这个作为我的主题:'邮件A的主题/这是邮件B的主题'

我如何使用面向对象的方式实现这一点?

我已经为mailA和mailB设置了两个独立的类

以面向对象的方式组合对象属性

假设您有一个基类Mail -或一个接口IMail -具有两个属性SubjectBody,您可以创建一个派生类CompositeMail:

public class CompositeMail : Mail
{
    private readonly List<Mail> _mails;
    public CompositeMail(params Mail[] mails) : this(mails.AsEnumerable())
    {
    }
    public CompositeMail(IEnumerable<Mail> mails)
    {
        if(mails == null) throw new ArgumentNullException("mails");
        _mails = mails.ToList();
    }
    public override string Subject
    {
        get { return string.Join("/", _mails.Select(x => x.Subject)); }
    }
    public override string Body
    {
        get
        {
            return string.Join(Environment.NewLine, _mails.Select(x => x.Body));
        }
    }
}

这是复合模式的一个简化实现。"缩写",因为它不包含添加、删除或枚举子元素的方法。如果您想添加此功能,只需使CompositeMail额外实现ICollection<Mail>

你可以这样设置它:

var compositeMail = new CompositeMail(mailA, mailB);

您可以在任何使用普通邮件的地方使用此实例,因为它派生自您在其他地方使用的Mail类。