Symbi0t
@Symbi0t

Как определять новые методы в производных классах?

Приветствую.
Есть следующая задача. Существует список сотрудников двух типов: employee и manager.
Определил для них соответствующие классы:
class Person
{
public:
	virtual void show() = 0;
};

class Employee: public Person
{
public:
	void show()
	{
		std::cout << "Employee" << std::endl;
	}
};

class Manager: public Person
{
public:
	void show()
	{
		std::cout << "Manager" << std::endl;
	}
};


Также, создал фабрику:
class PersonFactory
{
public:
	static Person* create(const std::string &type)
	{
		if (type == "Employee")
			return new Employee();
		if (type == "Manager")
			return new Manager();

		return NULL;
	}
};


Теперь можем создавать объекты динамически необходимого типа:
Person* emp = PersonFactory::create("Manager");

У менеджера есть список подчиненных сотрудников. Соответственно, класс должен содержать метод getListEmployee().
Но если мы добавим его в класс Manager, то придется добавлять и в родительский класс Person.
emp->getListEmployee(); // Будет ошибка, т.к. метод не определен в родительском классе

Но согласно общей концепции, у обычного сотрудника не может быть подчиненных. Значит метод getListEmployee() не нужен родительскому классу Person.
Как быть в таком случае? Как определять новые методы в родительских классах?
  • Вопрос задан
  • 240 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Но согласно общей концепции, у обычного сотрудника не может быть подчиненных. Значит метод getListEmployee() не нужен родительскому классу Person.


Нужен метод классу или не нужен зависит от его ответственности. Если вы собираетесь использовать Person для работы с сотрудниками любого типа (кстати, плохое название класса, не отражает сути), а у каких-то сотрудников в принципе могут быть подчинённые, то какой-то метод для этого должен присутствовать в Person. Удобство использования этого интерфейса будет зависеть от реализации.

Так, например, можно добавить метод getListEmployee(), возвращающий список подчинённых (кстати, опять плохое название метода, не отражает сути), а реализация этого метода в классе Employee может возвращать пустой список.
Или можно добавить метод getSubordinateEnumerator(), возвращающий интерфейс перечисления подчинённых, а в классе Employee возвращать из этого метода NULL.

Если же вы не собираетесь использовать единый интерфейс Person, а, например, будете пытаться привести Person* к типу Employee* или Manager* с помощью dynamic_cast, то метод в Person не нужен.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы