Чому явна реалізація інтерфейсу не може бути загальнодоступною?


75

У мене є метод у класі, який є реалізацією інтерфейсу. Коли я зробив це явна реалізація, я отримав помилку компілятора

The modifier 'public' is not valid for this item

Чому це заборонено мати publicдля явної реалізації інтерфейсу?

Відповіді:


70

Причиною явної реалізації інтерфейсу є уникнення зіткнень імен з кінцевим результатом у тому, що об'єкт повинен бути явно переданий на цей інтерфейс перед викликом цих методів.

Ви можете думати про ці методи не як загальнодоступні для класу, а як прив'язані безпосередньо до інтерфейсу. Немає підстав вказувати загальнодоступний / приватний / захищений, оскільки він завжди буде загальнодоступним, оскільки інтерфейси не можуть мати непублічних членів.

(Microsoft має огляд явної реалізації інтерфейсу )


3
для неявного інтерфейсу також не потрібно вказувати як загальнодоступний, але це дозволено, і насправді це потрібно робити. Отже, інтерфейс, що передбачає публічну логіку, насправді не пояснює вихідне питання, яке я б сказав.
liang

Для неявних інтерфейсів метод - це просто метод, який може бути приватним. Саме його підпис робить це реалізацією методу інтерфейсу. Явне визначення інтерфейсу не може бути нічим іншим, як публічним. Я бачу вашу думку, але TBH, дозволяючи загальнодоступним використання неявних методів, ймовірно, просто стосується того порядку, в якому робить компілятор.
Richard Szalay

3
"...since it will always be public..."; Технічно це неправильно, оскільки ви не можете викликати явно реалізовану функцію ззовні, поки не приведете об'єкт до інтерфейсу.
Massood Khaari,

@Massood - Їх відкритість не має нічого спільного з їх доступністю. Учасники, безумовно, є загальнодоступними, оскільки вони доступні з непов'язаних класів, а не лише з класу, що оголошує (приватний), похідних класів (захищений) або збірки (внутрішній)
Річард Шалай,

11
Це питання визначення поняття "публічний". Я перевірив специфікацію мови C # . У розділі 13.4.1, сторінка 392 сказано:"Explicit interface member implementations have different accessibility characteristics than other members. Because explicit interface member implementations are never accessible through their fully qualified name in a method invocation or a property access, they are in a sense private. However, since they can be accessed through an interface instance, they are in a sense also public."
Massood Khaari

27

Реалізація елемента-елемента дозволяє однозначно визначити члени інтерфейсу з однаковим підписом.

Без явних реалізацій членів інтерфейсу було б неможливо, щоб клас або структура мали різні реалізації членів інтерфейсу з однаковим типом підпису та повернення.

Чому явна реалізація інтерфейсу не може бути загальнодоступною? Коли член явно реалізований, до нього не можна отримати доступ через екземпляр класу, а лише через екземпляр інтерфейсу.

public interface IPrinter
{
   void Print();
}
public interface IScreen
{
   void Print();
}

public class Document : IScreen,IPrinter
{
    void IScreen.Print() { ...}
    void IPrinter.Print() { ...} 
}

.....
Document d=new Document();
IScreen i=d;
IPrinter p=d;
i.Print();
p.Print();
.....

Реалізації членів інтерфейсу Explict недоступні через екземпляри класів або структур.


9
Більшість людей не згодні з вами? Мені важко повірити, враховуючи, що саме тому існують явні реалізації інтерфейсу. msdn.microsoft.com/en-us/library/ms173157.aspx
Річард Салай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.