La cosa che spicca per me è l'interfaccia che eredita da un'altra interfaccia.
interface IConcreteUser : IUser {}
Trovo difficile immaginare la situazione in cui non sarebbe meglio dividere IConcreteUser in qualunque sia la sua funzionalità extra e l'IUser già esistente. Quindi avere la classe Concrete implementare entrambe le interfacce
interface IUser {
bool Login();
}
interface IAdmin {
bool RebootServer();
}
abstract class UserBase : IUser {}
class AdminUser : UserBase, IAdmin {}
In alternativa, se la funzionalità di amministrazione viene sempre utilizzata con la funzionalità Utente, ciò suggerisce che è meglio metterlo insieme in IUser.
Non dico che mai sia una cosa sensata da ereditare l'interfaccia. Ad esempio, potresti avere due tipi di oggetti che sono sia amministratori che utenti e desideri inserirli in un elenco
class AdminUser : IUser, IAdmin
class UserAdmin : IUser, IAdmin
List<INeedAnInterface> AdminUsers_and_UserAdmin;
Ma se sei in grado di cambiare le interfacce, puoi anche modificare l'ereditarietà degli oggetti.
class BaseUserAdmin : IUser, IAdmin
class AdminUser : BaseUserAdmin
class UserAdmin : BaseUserAdmin
Quindi credo che quello che sto dicendo sia, sì, il tuo codice sembra un po 'strano. Ma non rotto wierd