Ho una classe astratta in un'API che viene utilizzata dai metodi in un altro assembly. La classe ha un enum nidificato definito al suo interno, un po 'come questo:Le interfacce non possono dichiarare i tipi
abstract public class Thing
{
public enum Status { Accepted, Denied, Pending };
abstract public Status status { get; private set; }
etc...
}
Ho quindi deciso che sarebbe un design migliore se cosa era un'interfaccia. Ma non posso farlo:
public interface Thing
{
enum Status { Accepted, Denied, Pending };
Status status { get; }
etc...
}
Questo produce il messaggio di errore "Le interfacce non possono dichiarare i tipi". Tuttavia, se spostassi la definizione dell'enum al di fuori dell'interfaccia, in primo luogo interromperò l'incapsulamento (il tipo Status appartiene veramente a Thing e non ha senso da solo) e, cosa più importante, dovrei andare a modificare il codice in i molti altri assembly che usano questo. Riesci a pensare a qualche soluzione?
Se si è preoccupati per l'incapsulamento * breaking * (Non si incapsula dati membri in interfacce per definizione), si dovrebbe lasciare 'Thing' come classe. Non c'è niente di sbagliato nella tua classe base astratta. –
trovato alcuni altri posti in cui è stata posta questa stessa domanda, questo commento su questo ha alcune buone opzioni. http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/14beb8d1-63d9-42f7-b036-eb9ebb106d08 in pratica, è possibile dichiarare l'enum altrove oppure utilizzare una classe di un'interfaccia .... e questo è tutto. Non c'è modo di fare esattamente quello che stai cercando di fare, più che peccato. – Nevyn
L'argomento "incapsulamento" non ragiona con me e ti consiglierei di eliminare comunque il tipo nidificato pubblico. Se può essere esposto al mondo, allora trattalo come tale. –