C# Language "Nascondere" i membri con implementazione esplicita

Esempio

Non lo odi quando le interfacce inquinano la tua classe con troppi membri di cui non ti importa nemmeno? Bene, ho una soluzione! Implementazioni esplicite

public interface IMessageService {
    void OnMessageRecieve();
    void SendMessage();
    string Result { get; set; }
    int Encoding { get; set; }
    // yadda yadda
}

Normalmente dovresti implementare la classe in questo modo.

public class MyObjectWithMessages : IMessageService {
     public void OnMessageRecieve(){

     }

     public void SendMessage(){

     }

     public string Result { get; set; }
     public int Encoding { get; set; }
}

Ogni membro è pubblico.

var obj = new MyObjectWithMessages();

// why would i want to call this function?
obj.OnMessageRecieve();

Risposta: non lo so Quindi nessuno dei due dovrebbe essere dichiarato pubblico, ma semplicemente dichiarare i membri come privati ​​farà sì che il compilatore lanci un errore

La soluzione è usare un'implementazione esplicita:

public class MyObjectWithMessages : IMessageService{
    void IMessageService.OnMessageRecieve() {
        
    }

    void IMessageService.SendMessage() {
        
    }

    string IMessageService.Result { get; set; }
    int IMessageService.Encoding { get; set; }
}

Quindi ora hai implementato i membri come richiesto e non espongono alcun membro come pubblico.

var obj = new MyObjectWithMessages();

/* error member does not exist on type MyObjectWithMessages. 
 * We've succesfully made it "private" */
obj.OnMessageRecieve();

Se si desidera ancora accedere seriamente al membro anche se è esplicitamente implementato tutto ciò che si deve fare è gettare l'oggetto nell'interfaccia e si è pronti per andare.

((IMessageService)obj).OnMessageRecieve();