Ho difficoltà a trovare una buona convenzione di denominazione per i metodi nelle classi derivate che hanno lo stesso scopo dei metodi nella classe base. Ad esempio, se sia la classe base, sia la classe derivata, devono essere inizializzati:
public class Foo()
{
public void Initialize()
{
// base class initialization code here
InitializeDerived();
}
// force derived classes to implement their own initialize method
protected abstract void InitializeDerived();
}
public class Bar() : Foo
{
protected override void InitializeDerived()
{
// initialization code here
}
}
InitializeDerived () sembra goffo. L'unica altra opzione che posso pensare è di rendere virtuale il metodo Initialize () della classe base. Quindi la classe derivata potrebbe sovrascriverla, usando lo stesso nome, e chiamare prima il metodo Initialize () della classe base.
C'è un modo migliore? Una convenzione di denominazione migliore?
Questo potrebbe essere un esempio migliore, perché i costruttori non risolveranno il problema qui. In questo esempio, abbiamo un motore di regole in cui il codice client chiama polimorficamente Process () su ciascuna regola:
public class RuleBase()
{
public void Process()
{
// base class processing code here
ProcessDerived();
}
// force derived classes to implement their own process method
protected abstract void ProcessDerived();
}
public class RuleValidateHeight() : RuleBase
{
protected override void ProcessDerived()
{
// derived class processing code here
}
}
Il codice che consuma:
foreach (Rule rule in rules)
{
rule.Process()
}