簡體   English   中英

在派生類中添加屬性

[英]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++";

在您不知道是否可以完成此操作的情況下,可以使用isas進行測試。

將事物保持在合理的水平以應對它們。 顯然,談論可能不會編程的人的編程語言是沒有意義的,因此可以在層次結構的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM