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.....