2017-01-19 31 views
-1

我在Unity3D下面的類:我不能得到ACCES公共功能於一身的多態列表

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()),我不能訪問該功能!但它是公開的!出了什麼問題?

+2

因爲你的列表包含'Property'類型,'Property'只有一個方法 - 'equals' – Jonesopolis

回答

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()列表中的任何元素。

+0

謝謝!我認爲,當我在列表中添加一個「新的A(0)」時,我會接觸到這個方法。 – chick3n0x07CC

1

您的listProperty實例的通用列表。因此,編譯器只知道list(在這種情況下爲AB)的元素類型爲Property

由於抽象Property類沒有一個叫

getCurrentValue() 

編譯方法表明,你看到的錯誤。它根本不知道該元素實際上是A類型,因此它具有該方法。對象

public abstract class Property{ 
    public abstract bool equals (int value); 
    public abstract int getCurrentValue(); 
} 
0

投射到它的類型:

如果同時ABgetCurrentValue方法(且僅當Property每個子類中應該有它),你應該把它添加到Property類以及:

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

或者更明確:

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

你在第二個例子'A a =(A)list [0];' – juharr

+0

@ juharr謝謝你。更正了答案。 – chadnt