2013-04-12 76 views
3

我有一種情況,我必須發送郵件A並且有時候我必須發送郵件B,但是也有我想發送郵件的情況,該郵件由郵件A和郵件B.以面向對象的方式結合對象屬性

例如,郵件A的主題是'郵件主題A'。郵件B的主題是'這是郵件B的主題'。現在我有我想要這個作爲我的主題的情況:'郵件的主題A /這是郵件B的主題'

如何使用OO方式實現此目的?

我已經有兩個mailA和mailB分開的類。

+0

mailA和mailB是否有共同的接口或基類? –

+0

這時他們有一個共同的接口,但我可以重構這個,如果有必要 – Martijn

+1

爲MailA和MailB的實例創建一個+重載,比添加它的屬性值併發送新的組合對象 – user1740381

回答

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)); 
     } 
    } 
} 

這是Composite pattern的縮寫實現。 「縮寫」,因爲它不包含添加,刪除或枚舉子項的方法。如果你想添加這個功能,只需讓CompositeMail另外實現ICollection<Mail>

您可以instatiate這樣說:

var compositeMail = new CompositeMail(mailA, mailB); 

,你用一個正常的郵件,您可以在任何地方使用這個實例,因爲它是從你在其他地方使用的Mail類派生。