下面是樹結構的一個愚蠢示例,其中每個節點都執行不同類型的操作,但只有一個節點(任何節點)必須在開始和結束時執行一些常見工作的項目。避免調用基類的受保護成員
public abstract class Employee
{
public void StartProject()
{
AnnounceProjectToNewspapers();
DoActualWork();
PutProductOnMarket();
}
protected abstract void DoActualWork();
private void AnnounceProjectToNewspapers() { }
private void PutProductOnMarket() { }
}
public class Engineer : Employee
{
protected override void DoActualWork()
{
// Build things.
}
}
public class Salesman : Employee
{
protected override void DoActualWork()
{
// Design leaflets.
}
}
public class Manager : Employee
{
protected override void DoActualWork()
{
// Make gantt charts.
// Also delegate.
foreach (var subordinate in subordinates)
// ...but then compiler stops you.
subordinate.DoActualWork();
}
private List<Employee> subordinates;
}
問題是,您無法在基類上調用受保護的方法DoActualWork()
。
兩個解決方案,我看到的是:
- 讓
DoActualWork()
公衆。但是,這將允許任何人在沒有AnnounceProjectToNewspapers()
或PutProductOnmarket()
的情況下致電。 - 使
DoActualWork()
內部。但是這會阻止其他組件使用「管理系統」。
是否有一個標準的變通方法來避免這種限制?
你是什麼意思*「你不能在基類」*上調用受保護的方法'DoActualWork()'。到目前爲止,您的設計是慣例,我不認爲它有問題。 –
如果我理解正確,您需要將DoActualWork設置爲Manager類的專用設置,並且可以爲外部呼叫者提供相同的時間。這有點混亂,因爲它與繼承的抽象主義相矛盾。我認爲你需要將工作實現分離到一個單獨的類中,我們稱之爲Task,並根據需要將其成員設置爲public/private。 –
@OndrejTucny受保護的成員只能從派生類訪問,方法是調用派生類的靜態類型或派生類的派生類的對象。因此,'Manager'不能調用'subordinate.DoActualWork()',因爲從屬不是'Manager'或者派生自它。 –