基类:
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} }}。
如果需要更多信息,请发表评论,我会尽力提供。
答案 0 :(得分:2)
几乎不需要使用ref
parameters。
compare()
调用从Base_strategy
仅继承的函数
在这种情况下,您不需要它。 Base_strategy
是一个类,因此player1
和player2
已经引用了各自的对象。只需将其更改为:
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
类型的引用。
解决方案只是更改p1
和p2
的类型以匹配:
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
。