3
我有一種情況,我必須發送郵件A並且有時候我必須發送郵件B,但是也有我想發送郵件的情況,該郵件由郵件A和郵件B.以面向對象的方式結合對象屬性
例如,郵件A的主題是'郵件主題A'。郵件B的主題是'這是郵件B的主題'。現在我有我想要這個作爲我的主題的情況:'郵件的主題A /這是郵件B的主題'
如何使用OO方式實現此目的?
我已經有兩個mailA和mailB分開的類。
我有一種情況,我必須發送郵件A並且有時候我必須發送郵件B,但是也有我想發送郵件的情況,該郵件由郵件A和郵件B.以面向對象的方式結合對象屬性
例如,郵件A的主題是'郵件主題A'。郵件B的主題是'這是郵件B的主題'。現在我有我想要這個作爲我的主題的情況:'郵件的主題A /這是郵件B的主題'
如何使用OO方式實現此目的?
我已經有兩個mailA和mailB分開的類。
假設你有一個基類Mail
- 或接口IMail
- 與兩個屬性Subject
和Body
,可以創建派生類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));
}
}
}
這是Composite pattern的縮寫實現。 「縮寫」,因爲它不包含添加,刪除或枚舉子項的方法。如果你想添加這個功能,只需讓CompositeMail
另外實現ICollection<Mail>
。
您可以instatiate這樣說:
var compositeMail = new CompositeMail(mailA, mailB);
,你用一個正常的郵件,您可以在任何地方使用這個實例,因爲它是從你在其他地方使用的Mail
類派生。
mailA和mailB是否有共同的接口或基類? –
這時他們有一個共同的接口,但我可以重構這個,如果有必要 – Martijn
爲MailA和MailB的實例創建一個+重載,比添加它的屬性值併發送新的組合對象 – user1740381