J'ai 3 classes, deux Hériter de 1:classes de base nichant dans C#
public class Employee {
private virtual double getBonus() { ... }
private virtual double getSalary() { ... }
}
public class Nepotism : Employee {
private double getBonus() { ... }
}
public class Volunteer : Employee {
private double getSalary() { ... }
}
La question est donc parfois il y aura un bénévole qui obtient le bonus Népotisme - est-il possible d'écrire les constructeurs à permettent la surcharge/imbrication de la base classe comme ceci:
Employee Bill = new Volunteer(new Nepotism());
Je pense quelque chose comme:
public class Volunteer : Employee {
private Employee _nest;
public Volunteer(Employee nest)
: base() {
_nest = nest;
// now what?
}
}
Fondamentalement, je veux que certains objets aient les remplacements des deux classes.
Je voudrais d'éviter écrire les méthodes de substitution pour vérifier les classes imbriquées.
getSalary() {
return (nest != null) ? nest.salary : salary; // I want to avoid this if I can
}
Comment est-ce que je peux faire ceci? Suis-je sur la bonne voie? Suis-je hors des rails?
Dans votre modèle, un employé détermine le salaire de cet employé. Cela correspond-il au monde réel? Non. Vous constaterez probablement que votre conception OO se passe plus facilement lorsque le code modélise le processus métier avec plus de précision; ce qui détermine en fait le salaire d'un employé est la * politique de rémunération * de l'organisation. Si cette politique de rémunération change, vous voulez mettre à jour le code dans un seul endroit, au lieu d'une demi-douzaine de classes d'employés différents. Donc, faites une classe qui représente une politique d'entreprise, et mettez les règles là-dedans. –
D'accord - c'est pourquoi je suis allé avec la réponse de Jrista. Cela permettrait d'appliquer des politiques aux primes, salaires et autres méthodes d'indemnisation futures. – willoller
Bien que la méthode getSalary puisse accéder à un moteur de règles ou à une autre source (découplée?) Pour obtenir des informations sur le salaire. – willoller