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

时间:2015-08-14 12:37:32

标签: c# inheritance

我有一个包含各种预制件的清单。

此列表中的每个预制件都有一个附加了各种子类的脚本,这些子类包含一个整数' dicesides' (代表6/8/10双面骰子)。它们来自一个共同的基类' dice_BaseClass'。

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

下面是我的狡猾代码的一些简化示例

骰子父类

public class dice_BaseClass : MonoBehaviour {

private int dicesides = 8;

    public int DiceSides {
        get 
        { 
            return dicesides;
        }
        set
        {
            dicesides = value;
        }
    }
}
骰子儿童班'蓝色' - 只需设置dicesides

public class dice_ChildClass_Red : dice_BaseClass
{
    public void Start () {
        DiceSides = 12;
    }
}
骰子儿童班' RED' - 只需设置dicesides

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);
}

然而,这并不起作用。它只获取基类默认dicesides int。

我也尝试过研究泛型,认为这可能与它有关。下面的内容都是胡说八道,但也许看看我的思维过程已经消失并失败将会很有用。

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 );

    }
}

非常感谢您阅读和了解您的任何提示/解决方案。

2 个答案:

答案 0 :(得分:1)

您可以将 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

答案 1 :(得分:1)

我没有看到你在哪里调用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;
    }
}