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