我暂时没有这样做,我需要找出这是否是最好的OO方式。我无法在base
类的derived
类中分配(设置)受保护的属性。我有一个解决方案,但我想知道这是最好的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()
所以这就是我问过的原因,我在派生类中创建相同的属性是错误的,所以控制器可以看到它吗? (因为受保护的属性当然不能在继承之外看到)
答案 0 :(得分:0)
是的,我认为你对此表示怀疑。我们应该尽可能避免重复并使用OOP的全部功能。
另外,通过使类不可变并通过构造函数提供依赖性,可以避免许多问题。如果class 需要依赖项保持一致,则应通过构造函数提供此依赖项。这样做可以保证您自己(以及其他程序员)无法提供此依赖关系而无法创建类实例。例如,在您的情况下,我认为您无法发送电子邮件,而无需提供至信息,因此最好提供 To via构造函数。同样的推理可以应用于其他依赖。
另外,在派生类中分配受保护的属性本身可能是一个问题,可能导致违反Liskov替换,开放式关闭和其他SOLID原则。但是,当然,有时它可能是有用的,并且没有不这样做的一般规则。