Если вы могли бы сделать это, то вы могли бы всегда тривиально вызывать protected
членов любого класса, который позволял вам наследовать его, даже если производный класс не используется , Это полностью подрывает безопасность механизма protected
.
Например, скажем, мы получаем из Base
с Derived
, как указано выше. Если бы правила были не такими, как вы, вы можете добавить такой метод к Derived
:
public static void CallProtectedMethod(Base baseInstance)
{
baseInstance.ProtectedMethod();
}
и теперь любой может вызвать его так:
Derived.CallProtectedMethod(baseInstance);
в то время как прямой подход терпит неудачу:
baseInstance.ProtectedMethod();
В этом случае baseInstance
может действительно иметь тип Base
и не иметь ничего общего с Derived
. Чтобы предотвратить это и гарантировать, что методы protected
останутся protected
, если экземпляр действительно не имеет типа Derived
, вызов этих методов через другой экземпляр недопустим.
Аналогично для protected
конструкторов:
public static Base CreateProtectedBase()
{
return new Base();
}
и теперь любой может вызвать его так:
var baseInstance = Derived.CreateProtectedBase();
в то время как прямой подход терпит неудачу:
var baseInstance = new Base();