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. さらに情報が必要な場合は、コメントしてください。提供できるよう最善を尽くします。

4

3 に答える 3

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();
}

OtherStrategytype の参照にインスタンスを割り当てますtitfortat_strategy

解決策は、 のタイプを変更して一致させるだけp1ですp2

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

もう 1 つの可能性は、まったく使用する必要がないということです。メソッド内で呼び出し元の変数と変数 を変更する必要がある場合refにのみ使用する必要があります。comparep1p2compare

于 2013-08-24T14:06:08.147 に答える
1

ref「引数の内部状態を変更する」ためではなく、まったく異なるオブジェクトを指すように引数を再割り当てするためのものです。

を渡すことができた場合に何が起こるかを考えてみてくださいref p1。関数はその後実行できます

player1 = new other_strategy();

p1呼び出し元ではもはや a ではないため、タイプセーフに違反しtitfortat_strategyます。

于 2013-08-24T14:07:20.300 に答える