C# 如何找到基类的任何子类,然后从中获取变量
我有一个由各种预制件组成的列表 此列表中的每个预置都有一个脚本,该脚本附加了各种子类,这些子类包含一个整数“dicesides”(表示一个6/8/10面的骰子)。它们派生自一个公共基类“dice_BaseClass” 我想创建一个方法,查看列表中的每个预置,在预置中找到子类(这是困难的一点),获取dicesides变量并使用roll dice方法 下面是一些我的不可靠代码的简化示例 骰子父类C# 如何找到基类的任何子类,然后从中获取变量,c#,inheritance,C#,Inheritance,我有一个由各种预制件组成的列表 此列表中的每个预置都有一个脚本,该脚本附加了各种子类,这些子类包含一个整数“dicesides”(表示一个6/8/10面的骰子)。它们派生自一个公共基类“dice_BaseClass” 我想创建一个方法,查看列表中的每个预置,在预置中找到子类(这是困难的一点),获取dicesides变量并使用roll dice方法 下面是一些我的不可靠代码的简化示例 骰子父类 public class dice_BaseClass : MonoBehaviour { priva
public class dice_BaseClass : MonoBehaviour {
private int dicesides = 8;
public int DiceSides {
get
{
return dicesides;
}
set
{
dicesides = value;
}
}
}
骰子子子类“蓝色”-简单地设置骰子边
public class dice_ChildClass_Red : dice_BaseClass
{
public void Start () {
DiceSides = 12;
}
}
public class dice_ChildClass_Blue : dice_BaseClass
{
public void Start () {
DiceSides = 8;
}
}
骰子子子类“红色”-简单地设置骰子边
public class dice_ChildClass_Red : dice_BaseClass
{
public void Start () {
DiceSides = 12;
}
}
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 RollDice(){
foreach(游戏对象进入高尔夫){
var diceClass=teffect.GetComponent();
打印(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 );
}
}
public void GenericTest(),其中T:dice\u基类{
foreach(游戏对象进入高尔夫){
var testClass1=teffect.GetComponent(typeof(T));
var testClass2=effectClass.GetType();
var testClass3=teffect.GetComponent(“effectClass2”);
//effectClass=tefect.GetComponent(GetType().Name);
打印(“Hi”+2级);
}
}
非常感谢您通读并提供任何提示/解决方案。您可以将DiceSides属性标记为虚拟,并在子类中重写它,如下所示:
public class Base
{
public virtual int sides { get { return 8; } }
}
public class Child : Base
{
public override int sides { get { return 10; } }
}
测试:
结果:
10
8
我看不到您在哪里调用Start
,因此在子类中永远不会设置dicedes
属性。您应该在构造函数中设置该属性:
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;
}
}
我认为monobhavior
中的每一个细节都是Unity的基类和特殊性:@FSou1所以Start
是由GetComponent
调用的?对不起,我从来没有使用过Unity。我不太确定,但我希望topic starter确保在print
之前调用Start
,谢谢您的回复,它确实有效但这并不是我想要的结果,因为它依赖于每次我编写一个新的子类时都必须重写它,任何方法都需要重写和几乎从头开始编写。我认为我需要的是一种能够真正抓住子类并在其上调用方法的东西。我希望这有一定的意义