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