我在Unity3D中有以下课程:
public abstract class Property{
public abstract bool equals (int value);
}
另一个从中继承的人:
public class A : Property{
int currentValue;
// Constructor
public A(int newValue){
currentValue = newValue;
}
// Getter
public int getCurrentValue(){
return currentValue;
}
public override bool equals (int value){
// Do something
}
}
还有另一个B级等于A.
在我的主要功能中:
List<Property> list = new List<Property> ();
list .Add (new A (0));
list .Add (new B (2));
Debug.Log (list [0]); // Prints "A" -> It´s OK
Debug.Log (list [1]); // Prints "B" -> It´s OK
但我想打印对象A的当前值,我不明白为什么如果我Debug.Log(list[0].getCurrentValue())
,我无法访问该功能!但它是公开的!出了什么问题?
答案 0 :(得分:2)
您的列表包含Property
类型的元素:
List<Property>
只有一种方法:
public abstract class Property{
public abstract bool equals (int value);
}
虽然Property
的任何给定实现可能都有其他方法,但可能不会。编译器不能保证它。
如果该方法需要在所有Property
个对象上,请将其添加到Property
类:
public abstract class Property{
public abstract bool equals (int value);
public abstract int getCurrentValue();
}
并在派生类中覆盖它:
public override int getCurrentValue(){
return currentValue;
}
然后,您可以在列表中的任何元素上调用getCurrentValue()
。
答案 1 :(得分:1)
您的list
是Property
个实例的通用列表。因此编译器只知道list
(在本例中为A
和B
)的元素属于Property
类型。
由于抽象Property
类没有名为
getCurrentValue()
编译器会显示您看到的错误。它根本不知道该元素实际上是A
类型,因此它具有该方法。
如果A
和B
都有getCurrentValue
方法(并且只有Property
的每个子类都应该拥有它),您应该将其添加到{{1}同样的类:
Property
答案 2 :(得分:0)
将对象转换为它的类型:
Debug.Log((list[0] as A).getCurrentValue());
或者可能更清楚:
A a = (A)list[0];
Debug.Log(a.getCurrentValue());