Инкапсуляция (видимость и "вызываемость")
От: Pek2014 Россия  
Дата: 22.05.21 10:43
Оценка:
Долго думал... оказалось что...

Если вы добавили в класс приватный метод и теперь уверены, что
никто извне класса не сможет вызвать этот новый метод (ведь он приватный!),
то вы ошибаетесь. Нет у вас такой гарантии.

Да, новый метод не будет виден никому извне класса.
Это не значит, что его невозможно вызвать извне класса.

Это разные вещи — видимость и возможность вызова ("вызываемость").

Видимость/невидимость — это то, что нам обеспечивает (гарантирует) компилятор.
А вот возможность вызова — это вопрос нашей дисциплины программирования.
Если мы будем соблюдать некоторое правило, то эти две вещи совпадут.

Правило это такое:

не отдавать вовне класса ссылки на приватные члены класса.

Компилятор никак не помогает соблюдать это правило, а нарушить его легко...
Например, подписав свой приватный метод на некое событие.

Что сплошь и рядом делается в коде WinForms. Это делает код, генерируемый Visual Studio.
Посмотрите на все методы обработки событий формы. Все эти методы — приватные,
но вызываются они не из методов класса-формы (как положено приватным методам),
а извне кода формы. Поэтому относиться к методам обработки событий формы надо
как к фактически публичным. Ведь вы не контролируете ни "как", ни "когда",
ни "почему", ни с какими аргументами вызываются эти методы!
Значит фактически это методы публичные.

Предложение: методы-обработчики событий формы надо бы делать и формально публичными,
дабы не само-обманываться... Дабы понятия "видимость" и "вызываемость"
были по возможности близкими (лучше бы совпадали).

Что думаете? Правильно я понимаю ситуацию? Ни чего не напутал (запутал)?

PS

Метод Main() программы, который по умолчанию делается приватным, мне тоже режет глаз.
Всегда его делаю публичным. Какой же он приватный, если это самый главный публичный метод,
который я выставляю наружу, чтобы операционная система исполнила мою программу?!
winforms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.