游戏开发小结——C#中对来自不同类的对象执行多态

游戏开发小结——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#确实能够使用正确的方法,而无需进行任何混乱的类型比较。

猜你喜欢

转载自blog.csdn.net/qq_37270421/article/details/130003166