Что вы выбираете, защищенный или внутренний?
-
03-10-2019 - |
Вопрос
Если у меня есть класс с методом, который я хочу protected
а также internal
. Отказ Я хочу, чтобы это только полученные классы в сборке смогут называть это.
С protected internal
означает protected
или internal
, Вы должны сделать выбор. Что вы выбираете в этом случае - protected
или internal
?
Решение
Я хочу, чтобы это только полученные классы в сборке смогут называть это.
Ну тогда у вас есть два варианта. Вы можете сделать его защищенным, и всякий раз, когда один из ваших клиентов расширяет ваш класс и называет ваш метод, и вы узнаете об этом, вы можете написать их строго сформулированного письма, говорящего им, чтобы перестать делать это. Или вы можете сделать его внутренним, и делать кодекс отзывы кода вашего коллеги, чтобы убедиться, что они не используют метод, который они не должны использовать.
Я предполагаю, что последний - это дешевле и легче сделать. Я бы сделал это внутренним.
Другие советы
Лично я бы выбрал защищенный. Если подклассы в вашей собственной сборке достаточно хороши, чтобы вызвать метод, почему не подкласс в другой сборке? Возможно, вы можете ревертировать функциональность в отдельном (внутреннем) классе в целом.
Вам действительно нужно объективно подумать о цели метода. Внутренняя доступность почти всегда чувствует себя неправильно для меня. В основном из-за моего опыта, пытающегося вывести из контроля или классов в .NET Framework, где я столкнулся с кирпичной стеной, потому что кто-то решил отметить класс или метод как внутренний. Оригинальный автор никогда не замечал, что не имея доступа к этому методу, сделанным намного сложнее для реализации подкласса.
РЕДАКТИРОВАТЬ
Чтобы уточнить, внутренняя доступность для класса очень полезна, и я не подразумевал внутреннее в целом плохо. Моя точка зрения была то, что внутренние методы на общественном классе, кажется, не так. Правильно разработанный базовый класс не должен дать несправедливое преимущество для полученных классов в той же сборке.
Я верю, что правильный выбор internal
. Отказ Таким образом, вы можете защитить людей за пределами вашей сборки от призыва этого метода, и это только оставляет вас осторожным и вызывать только этот метод от производных классов. Легче быть осторожным в сборке, которую вы пишете, чем надежда, другие люди будут осторожны, когда они его используют.
Это такое причудливое решение сделать protected internal
иметь в виду protected
ИЛИ internal
. Отказ Для этого точного случая я бы использовал internal
. Отказ Причина в том, что если инкапсуляция сломана, я бы предпочел бы быть мной, скорее, чтобы кто-то не под моим контролем.
Я думаю, что ответ варьируется в зависимости от ваших потребностей. Если бы я был тобой, я бы сделал что-то подобное:
public class YourClass
{
protected class InnerClass
{
internal void YourMethod()
{
// Your Code
}
}
}