无法转换为' ref [继承]'到' ref [Base]'一个功能

时间:2013-08-24 13:56:56

标签: c# inheritance

基类:

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

3 个答案:

答案 0 :(得分:2)

几乎不需要使用ref parameters

  

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

在这种情况下,您不需要它。 Base_strategy是一个类,因此player1player2已经引用了各自的对象。只需将其更改为:

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

答案 1 :(得分: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方法中使用它,如果您需要修改来电者的p1和{{ 1}}里面的变量 p2

答案 2 :(得分:1)

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

考虑如果你可以传递ref p1会发生什么,然后该函数可以执行

player1 = new other_strategy();

并违反了类型安全,因为来电者中的p1不再是titfortat_strategy