ОБНОВЛЕНИЕ: переписать этот ответ, так как вопрос был переписан.
Мне неизвестно какое-либо название для рисунка, который вы проиллюстрировали.
Как вы думаете, причина этогоНедопустим доступ к полю, потому что мы не знаем, что экземпляр b является экземпляром _derived.«защищенный» доступ означает, что _derived разрешен доступ только к защищенным членам экземпляров _derived ;ему не разрешен доступ к защищенным членам экземпляров SomeOtherType, который также является производным от _base.
Теперь, если вопрос действительно таков: есть ли способ получить прямой доступ кчлен x от каждого производного класса до любого экземпляра? "тогда да.Вы отвергаете очевидное решение сделать его внутренним.(*) Есть другой способ.Сделайте это:
abstract class B
{
private B() {}
private int x;
private class D1 : B { }
private class D2 : B { }
public static B MakeD1() { return new D1(); }
public static B MakeD2() { return new D2(); }
}
Теперь методы B и методы производных классов D1 и D2 способны напрямую обращаться к this.x
, но методы других типов не способны это сделать.Нет других производных типов, кроме D1 и D2;не может быть, потому что единственный конструктор B является закрытым.И не может быть никаких экземпляров B, которые не являются D1 или D2, потому что они абстрактны.
(*) Помните, что если вы делаете это внутренне, то единственные люди, которым вы должны беспокоиться о доступе к вашему члену, это ваши сотрудники .Снизить их в обзоре кода, если они делают что-то оскорбительное для участника, - вполне приемлемое решение.