В чем разница между явной и неявной реализацией интерфейса в c # - PullRequest
1 голос
/ 11 июля 2011

В чем разница между явным интерфейсом и неявной реализацией интерфейса в c # / asp.net?в каком сценарии мы можем использовать явный интерфейс и неявную реализацию интерфейса.

Спасибо,

Pradeep

Ответы [ 2 ]

5 голосов
/ 11 июля 2011

Концепция неявной и явной реализации довольно проста:

  • Член с неявной реализацией будет доступен как через интерфейс, так и через реализующий его класс
  • ЧленПри явной реализации через интерфейс будут доступны только

Что касается того, почему и когда вы будете использовать тот или иной, это зависит.В случае, если вы реализуете более одного интерфейса с одним и тем же свойством / методом, явная реализация - это единственный вариант, так как это единственный способ узнать, какое свойство / метод вы намереваетесь вызвать.Очевидно, что в этом сценарии вы не можете иметь это свойство / метод для самого класса: если он есть, он будет только классом и не будет соответствовать ни одному из интерфейсов (которые будут иметь явную реализацию).

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

2 голосов
/ 11 июля 2011

Допустим, у вас есть два интерфейса IDoStuff<T> и IDoStuff, которые реализует ваш класс.У них обоих есть метод "GetStuff", но у одного есть подпись T GetStuff(), а у другого подпись object GetStuff().

Проблема в том, что .net не позволит вам иметь два метода с одинаковыми именами, которые отличаются только типом возвращаемого значения.Но вам нужно иметь оба этих метода в своем классе, чтобы удовлетворить оба интерфейса.Если T на самом деле object, то вы можете использовать явную реализацию следующим образом.

public T GetStuff()
{
  T stuff;
  //Stuff Is Got
  return stuff;
}

IDoStuff.GetStuff()
{
  return (object)GetStuff();
}

Обратите внимание, что поскольку IDoStuff требует требований безопасности GetStuff, IDoStuff.GetStuff будет public/private/protected/internal на основе объявления этого интерфейса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...