Вызов дочерних переменных из другого класса generi c, родительский переменный которого c - PullRequest
0 голосов
/ 10 апреля 2020

Я использую c# язык для единства.

Мне нужно использовать родительско-дочерний класс для системы инвентаризации.

Моя концепция сценария приведена ниже.

и у меня всегда ошибка при пометке.

Я знаю, что виртуальное переопределение может исправить это, но я просто хочу знать, что

Возможно ли использовать это концепция?

public class A
{
    public int a;
}

public class B : A
{
    public int b;
}

public class C : A
{
    public int c;
}


public class Main<T> where T : A, new()
{
    public void callValue(T item)
    {
        if (item is B)
        {
            Console.WriteLine(item.a + "||" + ((B)item).b); // error cannot convert T to B;
        }
        if (item is C)
        {
            Console.WriteLine(item.a + "||" + ((C)item).c);
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 10 апреля 2020

Вы очень близки в своем коде. Вы можете сделать if (item is X x_item) и затем использовать x_item как тип X. Вот так:

public class Main<T> where T : A, new()
{
    public void callValue(T item)
    {
        if (item is B b_item)
        {
            Console.WriteLine(item.a + "||" + b_item.b);
        }
        if (item is C c_item)
        {
            Console.WriteLine(item.a + "||" + c_item.c);
        }
    }
}

Но, кажется, очень странно иметь такой обобщенный метод c.

Я мог бы, например, сделать это:

public class D : A
{
    public int d;
}

И тогда это:

    var m = new Main<D>();
    m.callValue(new D());

Если это так, то какой смысл пытаться привести к B или C?

У вас плохой дизайн здесь.

0 голосов
/ 11 апреля 2020

Это мой код для использования;

public class ItemType
{
    public int ID;
}

public class UnstackableItem : ItemType
{

}

public class Equipment : UnstackableItem {
    public int durability;
}

public class StackableItem : ItemType
{
    public int amount;
}

public class Useable : StackableItem { 

}

public class Material : StackableItem { 

}
public class D : ItemType
{
    public int d;
}

public class Main<T> where T : ItemType, new()
{
    List<T> items;
    Dictionary<int, int> stackCheck;

    public void AddItem(T item, int amount)
    {
        if (item is StackableItem)
        {
            StackableItem(item, amount);
        }
        if (item is UnstackableItem)
        {
            UnStackableItem(item);
        }
    }

    public void UnStackableItem(T item) {
        if (item is StackableItem)
        {
            items.Add(item);
        }

    }

    public void StackableItem(T item, int amount)
    {
        if (stackCheck.ContainsKey(item.ID))
        {
            var itemFrominventory = items[stackCheck[item.ID]];

            if (itemFrominventory is StackableItem unstackItem)
            {
                unstackItem.amount += amount;
            }
        }
        else
        {
            //find empty Slot return value is emptySlotID
            items.Add(item);
            stackCheck.Add(item.ID, emptySlotID);
        }
    }
}
0 голосов
/ 10 апреля 2020

Обновите эти строки, чтобы использовать as вместо явного приведения:

Console.WriteLine(item.a + "||" + (item as B).b);

Console.WriteLine(item.a + "||" + (item as C).c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...