游戏开发小结——C#中对来自不同类的对象执行多态
一个简单的技巧,用于允许从不同类继承和引用同一基类的对象进行正确的函数分发。
C#是一种类型安全的语言,因此在Unity中,我们可以将继承自同一个基类的不同类的对象设置为同一个字段。下面是一个示例,以说明我的意思:
public abstract class BaseClass {
public abstract void DoSomething();
}
public class ChildA: BaseClass {
public override void DoSomething() {
Debug.Log("ChildA - DoSomething");
}
public void DoSomethingChildA() {
Debug.Log("ChildA - DoSomethingChildA");
}
}
public class ChildB: BaseClass {
public override void DoSomething() {
Debug.Log("ChildB - DoSomething");
}
public void DoSomethingChildB() {
Debug.Log("ChildB - DoSomethingChildB");
}
}
这里我们有一个名为“BaseClass”的基类和2个子类(ChildA和ChildB),它们拥有一个共同的函数和另一个特定于类的函数。
现在假设我们有一个控制器,它有一个字段,该字段引用类型为BaseClass的对象,但我们想要能够访问ChildA和ChildB的特定函数。问题是,在默认情况下,C#无法自动转换子级:您必须能够获取元素的类型信息,然后执行转换。像这样执行类型比较可能非常棘手,并且通常应该避免这样做。幸运的是,C#实际上可以执行这种自动多态性,只是这个功能被隐藏了!您只需要在对象上执行switch语句即可执行此任务。
此解决方案需要您编写一个小调度函数,但这不成问题。让我们看看我们的控制器会是什么样子:
public class MyController: MonoBehaviour {
public BaseClass mMyBaseClassObject;
public void RunChildMethod() {
switch(mMyBaseClassObject) {
case ChildA childA:
childA.DoSomethingChildA();
break;
case ChildB childB:
childB.DoSomethingChildB();
break;
default:
break;
}
}
}
如果您尝试它,您将意识到C#确实能够使用正确的方法,而无需进行任何混乱的类型比较。