以OO方式组合对象属性

Mar*_*ijn 3 c# design-patterns

我有一种情况,我必须发送邮件A,有时我必须发送邮件B,但也有一种情况,我想发送邮件,其中包括邮件A和邮件B的组合.

例如邮件A的主题是"邮件主题A".邮件B的主题是"这是邮件B的主题".现在我的情况是我希望这个作为我的主题:'邮件主题A /这是邮件B的主题'

我怎样才能使用OO方式实现这一目标?

我已经为mailA和mailB提供了两个单独的类.

Dan*_*rth 8

假设你有一个基类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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是Composite模式的缩写实现."缩写",因为它不包含添加,删除或枚举子项的方法.如果要添加此功能,只需CompositeMail另外实现ICollection<Mail>.

您可以像这样实例化它:

var compositeMail = new CompositeMail(mailA, mailB);
Run Code Online (Sandbox Code Playgroud)

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