У мене є метод у класі, який є реалізацією інтерфейсу. Коли я зробив це явна реалізація, я отримав помилку компілятора
The modifier 'public' is not valid for this item
Чому це заборонено мати public
для явної реалізації інтерфейсу?
У мене є метод у класі, який є реалізацією інтерфейсу. Коли я зробив це явна реалізація, я отримав помилку компілятора
The modifier 'public' is not valid for this item
Чому це заборонено мати public
для явної реалізації інтерфейсу?
Відповіді:
Причиною явної реалізації інтерфейсу є уникнення зіткнень імен з кінцевим результатом у тому, що об'єкт повинен бути явно переданий на цей інтерфейс перед викликом цих методів.
Ви можете думати про ці методи не як загальнодоступні для класу, а як прив'язані безпосередньо до інтерфейсу. Немає підстав вказувати загальнодоступний / приватний / захищений, оскільки він завжди буде загальнодоступним, оскільки інтерфейси не можуть мати непублічних членів.
(Microsoft має огляд явної реалізації інтерфейсу )
"...since it will always be public..."
; Технічно це неправильно, оскільки ви не можете викликати явно реалізовану функцію ззовні, поки не приведете об'єкт до інтерфейсу.
"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."
Реалізація елемента-елемента дозволяє однозначно визначити члени інтерфейсу з однаковим підписом.
Без явних реалізацій членів інтерфейсу було б неможливо, щоб клас або структура мали різні реалізації членів інтерфейсу з однаковим типом підпису та повернення.
Чому явна реалізація інтерфейсу не може бути загальнодоступною? Коли член явно реалізований, до нього не можна отримати доступ через екземпляр класу, а лише через екземпляр інтерфейсу.
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 недоступні через екземпляри класів або структур.