首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以面向对象的方式组合对象属性

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

Stack Overflow用户
提问于 2013-04-12 19:01:30
回答 1查看 62关注 0票数 3

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

例如,邮件A的主题是‘邮件A的主题’。邮件B的主题是“这是邮件B的主题”。现在我有这样的情况:‘邮件A的主题/这是邮件B的主题’

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

我已经为mailA和mailB创建了两个独立的类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-12 19:05:57

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

代码语言:javascript
运行
复制
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));
        }
    }
}

这是Composite pattern的简短实现。"Abbreviated",因为它不包含add、remove或枚举子对象的方法。如果您想添加此功能,只需让CompositeMail另外实现ICollection<Mail>即可。

你可以像这样实例化它:

代码语言:javascript
运行
复制
var compositeMail = new CompositeMail(mailA, mailB);

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15969654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档