Добавление свойств в производный класс - PullRequest
2 голосов
/ 24 марта 2011

Так что я пытаюсь кодировать интерфейс, а не реализацию.Таким образом, у меня есть фабрика, которая возвращает объект, производный от Employee.Таким образом, эти объекты могут быть чем-то вроде Developer: Employee, Секретарь: Employee и т. Д.

Поэтому я поместил все общие свойства, такие как FirstName, LastName, Email и т. Д., В базовый класс (Employee).

И я должен поместить все свойства, специфичные для каждого типа, именно в этот тип.Поэтому в Developer есть некоторые свойства, такие как Skills, ProgrammingLanguages ​​и т. Д., Но тогда я не смогу получить доступ к этим свойствам из объекта Employee, если не использую конкретный тип Developer.

например,

Employee employee = new EmployeeFactory.CreateEmployee(EmployeeType.Developer);
employee.ProgrammingLanguages = "C#, Java, C++"; <-- compile error

Как лучше всего это сделать?Отражение ...

Ответы [ 5 ]

4 голосов
/ 24 марта 2011

Зачем беспокоиться о фабрике, если вы собираетесь прямо сказать, какой тип сотрудника использовать?

Вместо этого вы можете просто написать:

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...
2 голосов
/ 24 марта 2011

Почему бы не использовать дженерики и иметь что-то вроде

T EmployeeFactory.CreateEmployee<T>() 
{
     return new T();
}

И назовите это как

var dev = EmployeeFactory.CreateEmployee<Developer>();

Таким образом, в итоге вы получите типизированного разработчика.

1 голос
/ 24 марта 2011

В вашем коде ясно, что при попытке сделать 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 иерархии.

0 голосов
/ 25 марта 2011

В этом случае я бы предложил использовать самое простое решение.Создайте один метод для каждого типа сотрудника, например:

public Developer CreateDeveloper();
public Secretary CreateSecretary();

Почему это "уродливое" решение?Потому что вам нужно знать тип в коде клиента в любом случае.Так зачем усложнять дженерики / рефлексию?Простота божественна.

0 голосов
/ 24 марта 2011

Мне кажется, по крайней мере, в этом конкретном случае, вы не должны использовать базовый тип.

Вы работаете с чем-то конкретным для 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++";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...