2013-08-24 28 views
0

基類:無法從 '參考文獻[繼承]' 轉換爲 '參考文獻[基本]' 的功能

abstract class Base_strategy 
    { 
    public Base_strategy() 
     { 
     EnemyLastTurn = Choices.NULL; 
     score = 0; 
     } 

    static public void compare(ref Base_strategy player1, ref Base_strategy player2) 
     { 
     /* stuff */ 
     } 

    abstract protected Choices firstTurn(); 
    abstract protected Choices defectedLastTurn(); 
    abstract protected Choices cooperatedLastTurn(); 

    protected Choices EnemyLastTurn; 

    public int score; 

    public abstract void addScore_Sucker(); 
    public abstract void addScore_Traitor(); 
    public abstract void addScore_Punishment(); 
    public abstract void addScore_Reward(); 
    } 

繼承類:

class titfortat_strategy : Base_strategy 
    { 
    titfortat_strategy() 
     { 

     } 
/* overridden functions */ 

    } 

代碼:

titfortat_strategy p1, p2; 
Base_strategy.compare(ref p1, ref p2); 

錯誤是Argument 1: cannot convert from 'ref titfortat_strategy' to 'ref Base_strategy' Argument 2: cannot convert from 'ref titfortat_strategy' to 'ref Base_strategy'

我不知道爲什麼它不起作用。它似乎應該,雖然... compare()調用從Base_strategytitfortat_strategy僅繼承的函數,並且必須更改參數的內部狀態,因此ref。 如果需要更多信息,請發表評論,我會盡我所能提供。

回答

2

使用ref parameters幾乎是不必要的。

compare()調用從Base_strategy繼承的函數hellip;只有

在這種情況下,你不需要它。 Base_strategy是一類,所以player1player2已經是對它們各自對象的引用。只需將其更改爲:

static public void compare(Base_strategy player1, Base_strategy player2) 
{ 
    /* stuff */ 
} 
+0

將其更改爲使其完美工作。謝謝。 – Sky

1

這不起作用,因爲它不安全。如果允許,你可以做:

public class OtherStrategy : Base_strategy { } 
titfortat_strategy ts = null; 


static public void compare(ref Base_strategy player1, ref Base_strategy player2) 
{ 
    player1 = new OtherStrategy(); 
} 

其中OtherStrategy實例分配給titfortat_strategy類型的引用。

的解決方案只是改變類型的p1p2匹配:

Base_strategy p1, p2; 
Base_strategy.compare(ref p1, ref p2); 

另一種可能性是,你可能不需要使用ref在所有 - 你只需要在你的compare的方法來使用它如果您需要修改 compare中的呼叫者p1p2變量。

1

ref不是用於「改變參數的內部狀態」,而是用於重新分配參數以指向完全不同的對象。

考慮一下,如果你可以傳遞ref p1會發生什麼,該功能可以再調用者執行

player1 = new other_strategy(); 

和違反類型安全,因爲p1將不再是一個titfortat_strategy

+0

這是一個很好的觀點。謝謝你通知我。 – Sky