簡體   English   中英

在派生類中分配受保護的屬性

[英]Assigning protected properties in derived class

我已經有一段時間沒有這樣做了,我需要找出這是否是最好的面向對象方法。 我在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;
        }
    }

在控制器中

  // A send email button was pressed by the user

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

我傾向於不通過派生的構造函數發送屬性,因為我相信設置屬性會更加簡潔。 但是,我知道在派生構造函數中可以設置基本屬性: base()

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

是的,我認為您的懷疑是正確的。 我們應該傾向於盡可能避免重復,並使用OOP的全部功能。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM