Approccio: 1che è l'approccio migliore controllare tipo di oggetto
class Employee
{
public:
virtual int calculateSalary() = 0;
};
class PermanentEmployee : public Employee {
const int salaryPerMonth;
public:
PermanentEmployee(int sal) : salaryPerMonth(sal){}
int calculateSalary() {
return salaryPerMonth;
}
};
class ContractEmployee : public Employee {
const int wagesPerHr;
int totalHour;
public:
ContractEmployee(int sal) : wagesPerHr(sal), totalHour(0){}
void setWorkingDuration(int time) {
totalHour = totalHour + time;
}
int calculateSalary() {
return wagesPerHr * totalHour;
}
};
class Manager {
list<Employee *> ls;
public:
void assignWorkingHour() {
list<Employee *>::iterator it;
for(it = ls.begin(); it != ls.end(); it++) {
Employee *emp = *it;
ContractEmployee* contractEmp = dynamic_cast<ContractEmployee* >(emp);
if(contractEmp) {
contractEmp->setWorkingDuration(5);
}
}
}
};
In problema, ci sono 2 tipo di organigramma PermanentEmployee e ContractEmployee. Esiste una classe chiamata Manager che contiene un elenco di tutti i dipendenti che lavorano sotto di lui. Per ContractEmployee, deve richiamare la funzione setWorkingDuration, che viene richiamata nel metodo assignWorkingHour della classe Manager.
Il problema è: Ecco tipo di dipendenti è in corso determind dall'operatore dynamic_cast e manager deve sapere su tutti i tipi di classe di derive di Employee
approach2: aggiungere un altro membro nella classe Employee
enum TypeOfEmployee {CONTRACT, PERMANENT};
e selezionare TypeOfEmployee per determinare il tipo di impiegato
Indicare qual è il migliore oppure Esiste un approccio alternativo?
Come la domanda. Curioso del costo di dynamic_cast. – Lou
http://www.nerdblog.com/2006/12/how-slow-is-dynamiccast.html potrebbe essere una lettura rilevante per te. –
Questa è una domanda sui compiti? Sono solo curioso. –