Отсутствует доступ к публичном полям родительского интерфейса напрямую

Допустим у меня есть интерфейс

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 шт):

Автор решения: Yaroslav

В интерфейсах должно быть только public, это суть его существования, быть инструкцией для пользования кем-то, скрывая способ реализации под абстракцией! То есть private там быть не должно от слова "совсем", как и protected.


В ИНТЕРФЕЙСАХ НЕТ РЕАЛИЗАЦИИ !!! "Реализация" в интерфейсе это просто шаблон для автозаполнения в классе, который будет реализовывать этот интерфейс, с наследованием никак не связан!

Если protected поле в интерфейсе тебе понадобилось для написания шаблона то: введите сюда описание изображения


Вот как он должен выгдядеть:

public interface IInvertoryMaster
{
    public IInvertory Invertory { get; }
}

Если в твоему инвенторе требуется поле Owner, то скорее всего это костыль и ты что-то делаешь не то. set инвенторя вообще выглядет подозрительным методом. Зачем вообще может понадобиться передача инвенторя? Хрень какае-то! Зуб даю на отсечение, кепку на стол, что там должна быть передача содержимого, а не инвентаря!!!

→ Ссылка