2014-11-05 79 views
0

我還沒有做過一段時間,我需要找出這是否是最佳的OO方式。我無法在derived類的base類中分配(設置)受保護的屬性。我有一個解決方案,但我想知道這是最好的design pattern使用還是有更好的方法嗎?在派生類中分配受保護的屬性

我的基類

public abstract class EmailBase 
{ 
    protected string Subject { get; set; } 
    protected string To { get; set; } 
    protected string From { get; set; } 

    protected virtual void Send() 
    { 
     using (MailMessage mail = new MailMessage()) 
     { 
      // Ok send message here... 
     } 
    } 

}

我有我需要發送,所以我認爲這將是有兩個派生類一個好主意,兩個不同的電子郵件模板,但是我會發布針對當前問題的一個派生類的代碼。

public class DerivedOne: EmailBase 
{ 
    private const string emailTemplate = "some static text for the body..."; 

    public DerivedOne() 
    { 
    } 

    // This is how I want to set the base class properties, 
    // but it feels I am just duplicating properties... 
    public string To 
    { 
     set 
     { 
      base.To = value; 
     } 
    } 

和Controller ...

// A send email button was pressed by the user 

    private bool SendEmail(Model) 
    { 
     DerivedOne eMail = new DerivedOne() 
     { 
      To = Model.To; 
     }; 
    } 

我傾向於,因爲我相信設置屬性往往是清潔不通過派生的構造函數發送了性能。然而,我知道在派生構造函數中,你可以設置基本屬性: base()

所以這就是爲什麼我問,我錯了在派生類中創建相同的屬性,以便控制器可以看到它? (因爲受保護的屬性當然不能在繼承之外看到)

+1

爲什麼你的基類中的屬性不公開? – galenus 2014-11-05 12:41:14

+0

這不會破壞多態的理論嗎? (這不是一回事,我認爲)所以我想我錯了? – user3428422 2014-11-05 12:45:19

+0

它強制實現多態,因爲您可以通過基類型的引用來訪問任何派生類型。 – galenus 2014-11-05 12:49:32

回答

0

是的,我認爲你對你的懷疑是正確的。我們應該傾向於儘可能避免重複並使用OOP的全部功能。

另外,通過使類不可變並通過構造函數提供依賴關係,可以避免很多問題。如果類需要依賴性保持一致,則應通過構造函數提供此依賴性。這樣做可以保證你(和其他程序員)在不提供這種依賴的情況下不能創建類的實例。例如,在你的情況下,我相信你不能發送電子郵件而不提供信息,所以最好通過構造函數提供。同樣的推理可以應用於其他依賴關係。

另外,在派生類中分配受保護屬性本身可能是一個問題,可能會導致違反Liskov替換,開放關閉和其他SOLID原則。但是,當然,有時它可能是有用的,並且不存在不這樣做的一般規則。

相關問題