Отсутствует доступ к публичном полям родительского интерфейса напрямую
Допустим у меня есть интерфейс
public interface IHasInvertory
{
protected Invertory _invertory { get; set; }
public Invertory invertory
{
get => _invertory;
set {
if (_invertory != null)
_invertory.Owner = null;
_invertory = value;
_invertory.Owner = this;
}
}
}
Он имеет поле _invertory (который никогда не должен быть использован вручную) и поле invertory, который и является тем самым полем, с которым можно спокойно взаимодействовать.
Проблема в том, что когда я пытаюсь унаследовать данный интерфейс, то я не могу получить прямой доступ к полю invertory:
public class Player : Creature, IHasInvertory
{
Invertory IHasInvertory._invertory { get; set; }
protected override void Start()
{
((IHasInvertory)this).invertory.Items.Clear(); // Работает
this.invertory.Items.Clear(); // Ошибка???
base.Start();
Controller = new PlayerController();
}
}
Почему так происходит, и как этого избежать?
P. S.: Версия Unity: 2022.3.7f1 (последняя 2022), версия C# вроде бы 9.0
P. S. 2: Проверил, не работает даже на последних версиях C#...
Ответы (1 шт):
В интерфейсах должно быть только public, это суть его существования, быть инструкцией для пользования кем-то, скрывая способ реализации под абстракцией! То есть private там быть не должно от слова "совсем", как и protected.
В ИНТЕРФЕЙСАХ НЕТ РЕАЛИЗАЦИИ !!! "Реализация" в интерфейсе это просто шаблон для автозаполнения в классе, который будет реализовывать этот интерфейс, с наследованием никак не связан!
Если protected поле в интерфейсе тебе понадобилось для написания шаблона то:

Вот как он должен выгдядеть:
public interface IInvertoryMaster
{
public IInvertory Invertory { get; }
}
Если в твоему инвенторе требуется поле Owner, то скорее всего это костыль и ты что-то делаешь не то. set инвенторя вообще выглядет подозрительным методом. Зачем вообще может понадобиться передача инвенторя? Хрень какае-то! Зуб даю на отсечение, кепку на стол, что там должна быть передача содержимого, а не инвентаря!!!