Denominazione del metodo di classe derivata

6

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()
}
    
posta Bob Horn 19.03.2013 - 20:14
fonte

4 risposte

11

Nella programmazione di giochi sono piuttosto abituato al prefisso 'On' in modo che tu possa pensare alla classe base che genera un 'evento' quando qualcosa sta per accadere.

protected override void OnInitialize() { /*code here*/ }
protected override void OnProcess() { /*code here*/ }

Questo è chiamato Template Method Template , a proposito.

Come commentano Martin di seguito, altri prefissi 'evento' utili includono Pre e Post. In un contesto di gioco in genere avresti PreUpdate OnUpdate PostUpdate.

    
risposta data 19.03.2013 - 23:15
fonte
4

Utilizza invece i costruttori per questo.

public class Foo
{
    public Foo()
    {
        // initialization code here
    }
}

public class Bar : Foo
{
    public Bar()
        : base() // base (Foo) constructor gets called first.
    {
        // initialization code for Bar goes here
    }
}

Ci sono molti motivi per cui, ma il più convincente è che la creazione di un oggetto in questo modo garantisce che si ottiene un oggetto completamente inizializzato in fase di costruzione.

    
risposta data 19.03.2013 - 20:35
fonte
3

Bene, sarà più facile se puoi chiamare Process dalla classe derivata e scalare l'albero di ereditarietà invece che in basso:

public class Bar: Foo
{
    public override void Process()
    {
         base.Process();  // optional
         // Process Derived Rule here.
    }
}
    
risposta data 19.03.2013 - 23:04
fonte
2

Il nome del metodo dovrebbe dire cosa fa il metodo, invece di dire semplicemente dove appare il metodo. I nomi possibili potrebbero essere:

ProcessRuleSpecifics
ProcessAfterInitialization
ResumeProcess
TerminateProcess

e così via

    
risposta data 19.03.2013 - 23:04
fonte