【问题标题】:Assigning protected properties in derived class在派生类中分配受保护的属性
【发布时间】:2014-11-05 12:31:32
【问题描述】:

我已经有一段时间没有这样做了,我需要确定这是否是最好的 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;
        }
    }

在控制器中...

  // A send email button was pressed by the user

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

我倾向于不通过派生构造函数发送属性,因为我相信设置属性往往更简洁。但是,我知道在派生构造函数中您可以设置基本属性: base()

所以这就是我问的原因,在派生类中创建相同的属性以便控制器可以看到我错了吗? (因为受保护的属性当然不能在继承之外看到)

【问题讨论】:

  • 为什么你在基类中的属性不是公开的?
  • 这不是破坏多态性理论吗? (这不是倒退,这是我的想法)所以我想我错了?
  • 它强制执行多态性,因为您可以通过基类型的引用访问任何派生类型。
  • 我想说:要么在你的基类中使属性抽象,要么使它们虚拟。 Your choice.
  • 请查看此 SO 帖子以供参考stackoverflow.com/questions/12270941/…

标签: c# oop design-patterns


【解决方案1】:

是的,我认为你的怀疑是对的。我们应该尽可能避免重复,并使用 OOP 的全部功能。

另外,您可以通过使您的类不可变并通过构造函数提供依赖关系来避免很多问题。如果类需要的依赖是一致的,这个依赖应该通过构造函数来提供。这样做可以保证您自己(和其他程序员)在不提供此依赖项的情况下无法创建类的实例。例如,在您的情况下,我认为您不能在不提供 To 信息的情况下发送 Email,因此最好通过构造函数提供 To。相同的推理可以应用于其他依赖项。

另外,在派生类中分配受保护的属性本身可能是一个问题,并可能导致违反 Liskov-substitution、Open-close 和其他 SOLID 原则。但是,当然,有时它可能是有用的,并且没有不这样做的一般规则。

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2018-11-27
    • 2012-09-05
    相关资源
    最近更新 更多