Looking for c# Keywords? Try Ask4Keywords

C# Language «Скрытие» членов с явной реализацией


пример

Разве вы не ненавидите его, когда интерфейсы загрязняют вас классом со слишком многими членами, которых вам даже не волнует? Ну, я получил решение! Явные реализации

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

Обычно вы реализуете класс следующим образом.

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

     }

     public void SendMessage(){

     }

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

Каждый участник является публичным.

var obj = new MyObjectWithMessages();

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

Ответ: Не знаю. Таким образом, ни один из них не должен быть объявлен открытым, но просто объявляя, что члены как частные, заставят компилятор выбросить ошибку

Решение заключается в использовании явной реализации:

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

    void IMessageService.SendMessage() {
        
    }

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

Итак, теперь вы внедрили участников по мере необходимости, и они не будут публиковать публичных участников.

var obj = new MyObjectWithMessages();

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

Если вы серьезно хотите получить доступ к члену, хотя явным образом реализую все, что вам нужно сделать, это передать объект в интерфейс, и вам хорошо идти.

((IMessageService)obj).OnMessageRecieve();