2014-11-05 43 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原则。但是,当然,有时它可能是有用的,并且不存在不这样做的一般规则。

相关问题