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_strategyto继承的函数titfortat_strategy,并且必须更改参数的内部状态,因此ref. 如果需要更多信息,请发表评论,我会尽力提供。

4

3 回答 3

2

几乎从不需要使用ref参数。

compare()Base_strategy仅调用从……继承的函数

在这种情况下,您不需要它。Base_strategy所以是一个类,player1并且player2已经是对其各自对象的引用。只需将其更改为:

static public void compare(Base_strategy player1, Base_strategy player2)
{
    /* stuff */
}
于 2013-08-24T13:59:22.020 回答
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,您只需要在方法中使用它。comparep1p2compare

于 2013-08-24T14:06:08.147 回答
1

ref不是为了“改变参数的内部状态”,而是为了重新分配参数以指向完全不同的对象。

考虑一下如果你可以通过会发生什么ref p1,然后函数可以执行

player1 = new other_strategy();

并违反类型安全,因为p1在调用者中将不再是titfortat_strategy.

于 2013-08-24T14:07:20.300 回答