创建一个变量来存储从同一类继承的类的对象



我正在尝试创建一个可以存储不同类型物品的库存。

如果我只为每个瓦片的库存使用一个变量,并且我不尝试将每种类型的物品放入一个类中,那么我能解决这个问题吗?

以下是我已经开始做的一些代码:

瓷砖等级:

public class Tile
{
public Item inventory;
}

物品类别:

using UnityEngine;
public class Item
{
public itemType type;
}
public enum itemType
{
crop,
tool,
cooker,
dish
}

感谢您的关注。

EDIT:这是通过使用polymorphism来解决的,将派生类强制转换为基类。

您可以创建一个所有项都实现的接口。这样,您就可以让许多类实现接口,并将它们的实例设置为Tile类中的type变量

IItem接口

public interface IItem
{
public itemType type {get; set;}
}

Item类实现接口

public class Item : IItem
{
public itemType type {get; set;}
}

瓷砖类

using UnityEngine;
public class Tile
{
public List<itemType> allowedItems;
public IItem inventory;
public virtual void interact (IItem item, PlayerInteraction player)
{
foreach (itemType allowedItem in allowedItems)
{
if (allowedItem != item.type)
{
continue;
}
if (inventory == null && item != null)
{
player.setItem(inventory)
inventory = item;
}
}
}
}

您可以将基类或接口存储在Tile中,您可以向基类/接口添加通用方法,也可以只对其进行模式匹配。

以下代码基于我与OP 的讨论

using System;
public class Program
{
public static void Main(string[] args)
{
Tile myTile = new Tile();
Crop myCrop = new Crop();
myTile.inventory = myCrop;
myTile.do_something_pattern_matching();
myTile.do_something_virtual_call();
}
}
public class Tile
{
public IItem inventory;
public void do_something_pattern_matching()
{
//you can direct check the type, no need for `itemType` field
if (inventory is Crop crop)
{
Console.WriteLine($"I have a crop with age {crop.age}!");
}
else
{
Console.WriteLine("nothing special");
}
}

public void do_something_virtual_call(){
if(inventory!=null)
Console.WriteLine($"The inventory is {inventory.type}!");
}
}
public enum itemType{crop,tool,cooker,dish}
public interface IItem // prepend *I* just by convention
{
// you don't really need this, but I leave it as example
itemType type{get;}
}
public class Crop : IItem
{
// same as itemType type{get{return itemType.crop;}}
public itemType type => itemType.crop;
public int age;
public Crop()
{
age = 11;
}
}

最新更新