如何找到基类的任何子类,然后从中获取变量

本文关键字:然后 获取 变量 子类 何找 基类 任何 | 更新日期: 2023-09-27 18:08:01

我有一个由各种预制件组成的列表。

这个列表中的每个预制件都有一个带有各种子类的脚本,这些子类持有整数"骰子"(代表6/8/10面骰子)。它们派生自一个公共基类'dice_BaseClass'。

我想创建一个方法来查看这个列表中的每个预制件,找到预制件中的子类(这是困难的一点),抓住dicesides变量并使用roll dice方法。

下面是一些我的可疑代码的简化示例

Dice父类

public class dice_BaseClass : MonoBehaviour {
private int dicesides = 8;
    public int DiceSides {
        get 
        { 
            return dicesides;
        }
        set
        {
            dicesides = value;
        }
    }
}

骰子子类'BLUE' -简单地设置骰子

public class dice_ChildClass_Red : dice_BaseClass
{
    public void Start () {
        DiceSides = 12;
    }
}

骰子子类'RED' -简单地设置骰子

public class dice_ChildClass_Blue : dice_BaseClass
{
    public void Start () {
        DiceSides = 8;
    }
}

然后在另一个类中包含一个预制件列表和附加的子脚本…

public void RollDice () {
    foreach (GameObject go in goList){
        var diceClass = teffect.GetComponent<dice_BaseClass>();
        print (diceClass.DiceSides);
}

这不起作用。它只获取基类的默认值。

我也试着研究泛型,认为这可能与它有关。以下都是废话,但也许它会有用,看看我的思维过程已经去和失败。

public void GenericTest<T>() where T : dice_BaseClass {
    foreach (GameObject go in goList){
        var testClass1 = teffect.GetComponent(typeof(T));
        var testClass2 = effectClass.GetType();
        var testClass3 = teffect.GetComponent("effectClass2");
        //effectClass = teffect.GetComponent(GetType().Name);
        print ("Hi " + effectClass2 );
    }
}

非常感谢您的阅读以及您提供的任何提示/解决方案。

如何找到基类的任何子类,然后从中获取变量

您可以将DiceSides属性标记为虚拟属性,并在Child类中像这样覆盖它:

public class Base
{
    public virtual int sides { get { return 8; } }
}
public class Child : Base
{
    public override int sides { get { return 10; } }
}
测试:

var arr = new [] { new Child(), new Base(), };
foreach (var a in arr) {
    Console.WriteLine(a.sides);
}
结果:

10
8

我不知道你在哪里调用Start,所以DiceSides属性永远不会在子类中设置。你应该在构造函数中设置这个属性:

public class dice_ChildClass_Red : dice_BaseClass
{
    public dice_ChildClass_Red() {
        DiceSides = 12;
    }
}
public class dice_ChildClass_Blue : dice_BaseClass
{
    public dice_ChildClass_Blue() {
        DiceSides = 8;
    }
}
相关文章: