Unity(C#)中如何实现Objects类owner变量动态切换Person/Company类型?
解决方案
方案1:使用接口(类型安全推荐)
定义统一的IOwner接口,让Person和Company实现该接口,这样Objects的owner可以用接口类型声明,既支持运行时切换类型,又能安全调用共同方法/属性。
步骤1:定义接口
public interface IOwner { // 把Person和Company共有的需要访问的成员抽象到这里,比如inventory List<Objects> Inventory { get; } // 可添加其他共同方法,比如物品转移逻辑 void AddItem(Objects item); }
步骤2:修改Person和Company实现接口
public class Person : IOwner { public List<Objects> inventory = new List<Objects>(); // 实现接口的Inventory属性 public List<Objects> Inventory => inventory; // 实现接口的AddItem方法 public void AddItem(Objects item) { inventory.Add(item); } // 原有其他代码... } public class Company : IOwner { public List<Objects> inventory = new List<Objects>(); public List<Objects> Inventory => inventory; public void AddItem(Objects item) { inventory.Add(item); } // 原有其他代码... }
步骤3:修改Objects类
public class Objects { public IOwner owner; public void TransferOwner(IOwner newOwner) { // 从旧所有者的物品列表移除自身 owner.Inventory.Remove(this); // 切换所有者 owner = newOwner; // 添加到新所有者的物品列表 owner.AddItem(this); } // 其他原有代码... }
该方案完全支持多次类型切换(Person→Company→Person),编译时就能检查成员调用合法性,不会出现运行时意外错误,是最规范的实现方式。
方案2:使用dynamic类型(快速实现)
如果不想修改Person和Company的原有代码,直接用dynamic类型声明owner,它支持运行时任意切换类型,只要调用的成员在当前实例中存在即可。
修改Objects类
public class Objects { public dynamic owner; public void SwitchOwner() { // 第一次赋值为Person owner = new Person(); owner.inventory.Add(this); // 切换为Company owner = new Company(); owner.inventory.Add(this); // 再切回Person,完全支持 owner = new Person(); } // 其他原有代码... }
注意:dynamic会跳过编译时类型检查,如果调用了当前实例不存在的成员,运行时会抛出RuntimeBinderException,调试时需注意。但对于小型游戏场景,只要确保调用的成员在Person和Company中都存在,这个方案非常快捷。
方案对比
- 优先选接口方案:类型安全、可维护性高,适合长期迭代的项目。
- 若不想修改原有类,选dynamic方案:实现成本低,快速满足需求。
内容的提问来源于stack exchange,提问作者Florian Koszinowski
相关产品推荐
相关产品推荐

