[英]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.