[英]Adding properties in derived class
因此,我尝试编写接口而不是实现的代码。 所以我有一个工厂,它返回一个从Employee派生的对象。 因此,这些对象可能类似于“开发人员:员工”,“秘书:员工”等。
因此,我将所有共享属性(如FirstName,LastName,Email等)放在基类(Employee)中。
我应该将每种类型的所有特定属性都放在该类型中。 因此,Developer中将具有一些属性,例如Skills,ProgrammingLanguages等,但是除非使用具体类型的Developer,否则我将无法从Employee对象访问这些属性。
例如
Employee employee = new EmployeeFactory.CreateEmployee(EmployeeType.Developer);
employee.ProgrammingLanguages = "C#, Java, C++"; <-- compile error
最好的方法是什么? 反射...?
如果您要明确说出要使用哪种类型的员工,为什么还要麻烦工厂?
相反,您可以编写:
Developer dev = new Developer();
dev.ProgrammingLanguages = "C#, Java, C++"; // compiles fine
以后,您仍然可以将“开发人员”添加到员工列表中,即:
IList<Employee> theEmployees = GetEmployees();
theEmployees.Add(dev); // This is fine, since Developer is an Employee...
为什么不使用泛型并拥有类似的东西
T EmployeeFactory.CreateEmployee<T>()
{
return new T();
}
并称它为
var dev = EmployeeFactory.CreateEmployee<Developer>();
这样一来,您最终将得到类型化的开发人员。
在您的代码中,当您尝试使用employee.ProgrammingLanguages
时,您会清楚地知道该employee
属于Developer
类型。 因此,您可以强制转换为:
Developer dev = new (Developer)EmployeeFactory.CreateEmployee(EmployeeType.Developer);
dev.ProgrammingLanguages = "C#, Java, C++";
或者更多:
Developer dev = new Developer(); // If you don't really need the factory.
dev.ProgrammingLanguages = "C#, Java, C++";
在您不知道是否可以完成此操作的情况下,可以使用is
或as
进行测试。
将事物保持在合理的水平以应对它们。 显然,谈论可能不会编程的人的编程语言是没有意义的,因此可以在层次结构的Developer
级别上正常工作。 处理假期和薪水的代码对于所有员工应该是相同的,或者至少应通过可能被覆盖的通用接口进行工作,因此它将在层次结构的Employee
级别上起作用。
在我看来,至少在这种情况下,您不应该使用基本类型。
您使用的是特定于Developer
东西,而不是通用的Employee
因此您失去了使用基本类型的好处。 在这种情况下,只需创建一个新的开发人员:
Developer developer = new Developer();
developer.ProgrammingLanguages = "C#, Java, C++";
话虽如此,您总是可以尝试将类型转换回更具体的类型:
Employee employee = new EmployeeFactory.CreateEmployee(EmployeeType.Developer);
Developer developer = employee as Developer;
if(developer != null) developer.ProgrammingLanguages = "C#, Java, C++";
在这种情况下,我建议使用最简单的解决方案。 为一种员工类型创建一个方法,如下所示:
public Developer CreateDeveloper();
public Secretary CreateSecretary();
为什么采用这种“丑陋”的解决方案? 因为您需要以任何一种方式了解客户端代码中的类型。 那么为什么要使泛型/反射复杂化呢? 朴素是神圣的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.