Come progettare metodi statici di scopo simile

3

So che non è possibile sovrascrivere le funzioni statiche, ma per quello che sto cercando di fare, sembra il modo più logico per progettare la mia classe.

Ho un metodo che è associato alla mia classe astratta, che voglio lavorare senza che la classe sia istanziata, ma funzionerà diversamente su diverse implementazioni di quella classe astratta (tutte staticamente)

Di solito quando succede capita qualcosa o c'è un modo migliore per avvicinarmi al design, quindi spero che qualcuno qui possa mettermi sulla strada giusta.

Essenzialmente ho una classe astratta di contenuti come:

public abstract class Content{
   public virtual void copyAll();
   public virtual void VerifyContent();
   public static virtual Dictionary<int,Content> ProcessAllFromDT(DataTable dt) //Cannot exist
}

E poi un'implementazione di quella Suoneria e Wallpaper

public class Wallpaper:Content{
   public void CopyAll(){...}
   public void VerifyContent(){...}
   //Loads Wallpapers From DT
   public static Dictionary<int,Content> ProcessAllFromDT(DataTable dt){...} //content in this case is a wallpaper
}

Infine sarebbe bello avere qualcosa del tipo:

public void ProcessAllContent<T>() where T:Content{
    ...
    var dictionary = T.ProcessAllFromDT(dt); // Doesn't compile.
}

Suggerimenti su un design migliore per ciò che sto cercando di fare qui?

    
posta Mr. MonoChrome 10.02.2015 - 15:56
fonte

1 risposta

4

Se ti capisco bene (e non penso di sì) allora potresti ...

Potresti creare un membro statico per una classe statica generica che ha la funzione per ogni tipo di sottoclasse. Basta fare in modo che ogni sottoclasse abbia un costruttore statico che imposta l'azione appropriata su come esegue l'elaborazione.

public static class ProcessDt<T>
{
    public Action ProcessAllFromDt { get; set; }
}

public class ZuberfizzContainer : AbstractContainer
{
    static ZuberfizzContainer()
    {
        ProcessDt<ZuberfizzContainer>.ProcessAllFromDt = () => ZuberfizzContainer.StaticZuberfizzMethod();
    }
}

public class GinghamContainer : AbstractContainer
{
    static GinghamContainer()
    {
        ProcessDt<GinghamContainer>.ProcessAllFromDt = () => GinghamContainer.StaticGinghamMethod();
    }
}

quindi l'utilizzo sarebbe:

ProcessDt<ZuberfizzContainer>.ProcessAllFromDt(); // This will do the zuberfizz specific stuff
ProcessDt<GinghamContainer>.ProcessAllFromDt(); // This will do the gingham specific stuff
// or any other one that sets the processallfromdt method for its type
    
risposta data 10.02.2015 - 17:39
fonte

Leggi altre domande sui tag