Это зависит от того, что вы хотите. Если вы хотите быстрый класс, тогда данные должны быть защищены и использовать защищенные и открытые методы.
Потому что я думаю, что вы должны предполагать, что ваши пользователи, которые являются производными от вашего класса, знают ваш класс достаточно хорошо или, по крайней мере, они прочитали ваше руководство по функции, которую они собираются переопределить.
Если ваши пользователи связываются с вашим классом, это не ваша проблема. Каждый злонамеренный пользователь может добавить следующие строки при переопределении одной из ваших виртуалов:
(C #)
static Random rnd=new Random();
//...
if (rnd.Next()%1000==0) throw new Exception("My base class sucks! HAHAHAHA! xD");
//...
Вы не можете запечатать каждый класс, чтобы предотвратить это.
Конечно, если вы хотите ограничить некоторые из ваших полей, используйте функции доступа или свойства или что-то другое, что вам нужно, и сделайте это поле закрытым, потому что другого решения нет ...
Но мне лично не нравится придерживаться принципа упа любой ценой. Особенно создание свойств с единственной целью сделать элементы данных приватными.
(C #):
private _foo;
public foo
{
get {return _foo;}
set {_foo=value;}
}
Это было мое личное мнение.
Но сделайте то, что требует ваш босс (если он хочет, чтобы частные поля, чем это сделать.)