Alternative a #if quando il polimorfismo non sembra possibile

2

Ci sono un paio di posti in cui #if sembra darti capacità che il polimorfismo non ha:

  • Specifica specificando la classe base
  • Quando una sezione contiene codice non riconosciuto da un compilatore su un'altra piattaforma
    • es. alcuni nuovi operatori sono supportati solo su una piattaforma

Stavo pensando di suddividere in 3 classi parziali quindi ogni piattaforma include il 2 richiesto, ma mi sembra peggio.

Esempio 1

Modifica della classe base, a seconda delle condizioni

public class FullBase
{
    public void Register()
    {
        Console.Write("I am full featured so will use the :-) operator");
        int a = 1 :-) 2
    }
}
public class MobileBase
{
    public void Register()
    {
        Console.Write("My compiler does not know what the :-) operator is");
    }
}
#if MOBILE
    public class MyClass : MobileBase
#else
    public class MyClass : FullBase
#endif
{
    //...
}

Esempio 2

Qui, ho una classe per nascondere il boilerplate del pattern IDisposable. Se mi trasferissi su DI, penso che introdurrebbe il codice di conversione DI nelle molte classi derivate.

public class Disposable : IDisposable
{
    //...

    private void RunChecks()
    {
        #if !MOBILE
          //Use reflection to walk the OBJECT tree looking for potential issues
        #endif
    }
}

public class A: Disposable
{
    //...
    protected override void DisposeManagedResources()
    {

    }

}
// Also Class B, C, D, E.....
    
posta Andy Joiner 24.04.2015 - 12:16
fonte

1 risposta

2

La compilazione condizionale crea efficacemente più versioni della base di codice. Questo è esattamente lo scopo dei rami di controllo delle versioni.

L'altra alternativa è inserire qualsiasi codice necessario per variare nel proprio assembly / dll . Diverso dll s può contenere diverse implementazioni della stessa classe (supponendo che i campi pubblici siano gli stessi).

Entrambe le alternative hanno il vantaggio di non ingombrare il codice con ogni implementazione alternativa simultaneamente e di presentare solo il codice con cui stai lavorando come un insieme coerente.

    
risposta data 24.04.2015 - 13:42
fonte

Leggi altre domande sui tag