如何找到基类的任何子类,然后从中获取变量
本文关键字:然后 获取 变量 子类 何找 基类 任何 | 更新日期: 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;
}
}