C# 如何最好地应用DRY原理,并为每个类和子类在单个构造函数中设置标题?

C# 如何最好地应用DRY原理,并为每个类和子类在单个构造函数中设置标题?,c#,inheritance,constructor,C#,Inheritance,Constructor,以下是一些示例代码(MWE): 如何设置类名的标题(在Partner中除外),而不必在每个构造函数中进行设置?在原始代码中,title具有以下有趣的属性: 它是只读的(无设置器) 在构造函数中指定一次 在大多数情况下,属性的值等于类名 考虑到这一点,Title的值可以通过返回当前类类型名称来动态计算。声明它是为了Partner类可以通过重写属性getter来更改默认行为 类的其余声明: public class Associate : Employee { // Properties

以下是一些示例代码(MWE):


如何设置类名的标题(在Partner中除外),而不必在每个构造函数中进行设置?

在原始代码
中,title
具有以下有趣的属性:

  • 它是只读的(无设置器)
  • 在构造函数中指定一次
  • 在大多数情况下,属性的值等于类名
考虑到这一点,
Title
的值可以通过返回当前类类型名称来动态计算。声明它是为了
Partner
类可以通过重写属性getter来更改默认行为

类的其余声明:

public class Associate : Employee
{
   // Properties
   public int NumberOfEngagements { get; set; }

   public Associate() 
   {
      NumberOfEngagements = 0;
   }

    public Associate(int num_engagements)
    {
       this.NumberOfEngagements = num_engagements;
    }

}

public class Director : Employee
{  
   public int NumberOfProjectsManaged { get; set; }  // additional property

   public Director() : { NumberOfProjectsManaged = 0; } // constructor

   public Director(int num_projects)
   {
       NumberOfProjectsManaged = num_projects;
   }

   public override void Display()
   {
       base.Display();
       Console.WriteLine("Number of Projects Managed: {0}", NumberOfProjectsManaged);
   }
}

我不完全确定我是否理解(我正在学习),但我会尝试一下+1--如果你有时间,并且如果你非常欣赏它(并且可能标记为已接受),你可以解释得更多,但这只针对合作伙伴。我怎样才能让合伙人和董事也只定义一次呢?请记住,MWE中的构造函数比MWE中的要多得多,所以我想在不必在每一个构造函数中定义它的情况下实现它。现在就非常有意义了。谢谢
public abstract class Employee
{
    public virtual string Title 
    { 
        get { return GetType().Name; }
     }
}

public class Partner : Director {
{

      public Partner()  
      {
         this._jobTitle = SpecificTitle.Partner;  // defaults to Partner
      } 

       public Partner(SpecificTitle jobTitle) 
       {
          this._jobTitle = jobTitle;  // overloaded ctor allows user to specify
       }


     public override string Title { get {return GetJobTitle();}  


      public enum SpecificTitle
      {
          Principal,
          Partner
      };

       private SpecificTitle _jobTitle;


      private string GetJobTitle()
      {
          switch (_jobTitle)
           {
             case SpecificTitle.Principal:
               return "Principal";

             case SpecificTitle.Partner:
             default:
               return  "Partner";
            }
        }

    }


}
public class Associate : Employee
{
   // Properties
   public int NumberOfEngagements { get; set; }

   public Associate() 
   {
      NumberOfEngagements = 0;
   }

    public Associate(int num_engagements)
    {
       this.NumberOfEngagements = num_engagements;
    }

}

public class Director : Employee
{  
   public int NumberOfProjectsManaged { get; set; }  // additional property

   public Director() : { NumberOfProjectsManaged = 0; } // constructor

   public Director(int num_projects)
   {
       NumberOfProjectsManaged = num_projects;
   }

   public override void Display()
   {
       base.Display();
       Console.WriteLine("Number of Projects Managed: {0}", NumberOfProjectsManaged);
   }
}