[英]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.