以OO方式组合对象属性

时间:2013-04-12 11:01:30

标签: c# design-patterns

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

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

我如何使用OO方式实现这一目标?

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

1 个答案:

答案 0 :(得分:8)

假设您有一个基类Mail - 或一个接口IMail - 使用两个属性SubjectBody,您可以创建一个派生类{{1} }:

CompositeMail

这是Composite pattern的缩写实现。 “缩写”,因为它不包含添加,删除或枚举子项的方法。如果您想添加此功能,只需让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); 类。