我无法访问多态列表中的公共函数

时间:2017-01-19 18:30:06

标签: c# list inheritance polymorphism

我在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()),我无法访问该功能!但它是公开的!出了什么问题?

3 个答案:

答案 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)

您的listProperty个实例的通用列表。因此编译器只知道list(在本例中为AB)的元素属于Property类型。

由于抽象Property类没有名为

的方法
getCurrentValue()

编译器会显示您看到的错误。它根本不知道该元素实际上是A类型,因此它具有该方法。

如果AB都有getCurrentValue方法(并且只有Property的每个子类都应该拥有它),您应该将其添加到{{1}同样的类:

Property

答案 2 :(得分:0)

将对象转换为它的类型:

Debug.Log((list[0] as A).getCurrentValue());

或者可能更清楚:

A a = (A)list[0];
Debug.Log(a.getCurrentValue());