C# После уродства наследования требуется доступ к родителю - PullRequest
0 голосов
/ 27 мая 2020

Моя основная проблема здесь, вероятно, заключается в правильной формулировке проблемы, поэтому мне не удалось найти подходящий ответ.

Используя C# У меня есть код, подобный приведенному ниже:

class SlotEngine {
    // create Slots
}

class Slot {
    public SlotEngine parent;
}

class Inventory : SlotEngine {
    public void myfunc() {}
}

class OtherClass {
    void Func() {
        Slot myslot = get a slot;
        myslot.parent.myfunc(); // ofc doesnt work
        ((Inventory)(myslot.parent)).myfunc();  // does work, but ugly
    }
}

Is это предпочтительный способ пометить дочерний класс его родительским, а затем получить доступ к этому родительскому новому классу после наследования? Это определенно уродливо.

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Нет гарантии во время компиляции, что родительский элемент слота будет иметь метод myFunc. Вызов небезопасен по типу. На самом деле вам следует проверить, есть ли это, например:

var inventory = mySlot.parent as Inventory;
if (inventory != null)
{
    inventory.myfunc();
}

Но лучший способ - гарантировать, что тип имеет метод myfunc. Например, вы можете определить интерфейс и заставить все возможные SlotEngines реализовать его.

interface IFuncable
{
    void myfunc();
}

abstract class SlotEngine : IFuncable
{
    abstract public void myfunc();
0 голосов
/ 27 мая 2020

Я могу предложить вам следующие изменения.

Определите myfun c как виртуальный в базовом классе. т.е. на SlotEngine. Поскольку Inventory является производным от SlotEngine, вы можете переопределить myfun c в классе Inventory и, таким образом, в OtherClass вы можете вызвать myfun c без преобразования типа.

Однако myfun c из SlotEngine будет называться

  class SlotEngine
    {
        // create Slots
        public virtual void myfunc()
        {

        }
    }

    class Slot
    {
        public SlotEngine parent;
    }

    class Inventory : SlotEngine
    {
        public override void myfunc() { }
    }

    class OtherClass
    {
        void Func()
        {
            Slot myslot = get a slot;
            myslot.parent.myfunc(); 
           // ((Inventory)(myslot.parent)).myfunc();  // does work, but ugly
        }
    }
...