作者sfp (Fru:z)
看板C_Sharp
标题[问题] 互相持有reference的物件
时间Thu Mar 29 10:35:33 2007
这个范例是我自己想出来的一个简单oo的练习
程式的目的在模拟竞技场上两个人打来打去 两个人的血量都是100
任一人没血时 程式就结束
我做了两个class 一个Arena 一个Fighter
程式执行时 Arena中产生两个Fighter的物件
Fighter中含有一个reference 指到对手
下面的原始码可以跑
========================= 原始码 ======================
using System;
using System.Collections.Generic;
using System.Text;
namespace csFighter
{
public class Fighter
{
public Fighter(int id, int blood, Fighter f)
{
this.id = id;
this.blood = blood;
this.opponent = f;
Console.WriteLine("Fighter" + id + " constructor...");
}
public Fighter(int id, int blood)
{
this.id = id;
this.blood = blood;
Console.WriteLine("Fighter" + id + " overloaded constructor...");
}
// Methods
public void SetOpponents(Fighter f)
{
opponent = f;
}
public void Fight()
{
opponent.TakeDamage(3);
}
public void TakeDamage(int damage)
{
blood = blood - damage;
}
public override string ToString()
{
return "Fighter " + id + ": " + blood;
}
// properties
private int blood;
public int Blood
{
get
{
return blood;
}
set
{
blood = value;
}
}
private int id;
public int ID
{
get
{
return id;
}
set
{
id = value;
}
}
//
private Fighter opponent;
}
class Arena
{
public Arena()
{
f1 = new Fighter(1, 100);
f2 = new Fighter(2, 100);
f1.SetOpponents(f2);
f2.SetOpponents(f1);
r = new Random();
}
public void StartFighting()
{
while(f1.Blood > 0 && f2.Blood > 0)
{
switch(r.Next(1, 3))
{
case 1:
f1.Fight();
Console.WriteLine("Fighter 1 attacks");
break;
case 2:
f2.Fight();
Console.WriteLine("Fighter 2 attacks");
break;
default:
break;
}
}
Console.WriteLine("Fighter1: " + f1.Blood);
Console.WriteLine("Fighter2: " + f2.Blood);
}
private Random r;
private Fighter f1;
private Fighter f2;
}
class Program
{
static void Main(string[] args)
{
Arena a = new Arena();
a.StartFighting();
}
}
}
============================= 原始码结束 ==========================
我的问题是 如果Arena的constructor我写成
f1 = new Fighter(1, 100, f2);
f2 = new Fighter(2, 100, f1);
r = new Random();
则compile不会过
我另外在c++试过 写成
Arena()
:f1(1, f2), f2(2, f1)
{}
是可以过的
想请问 在C#中两个互相持有reference的物件
建立起来的话 一定要先建立物件 才能设定reference
不能在constructor中一次做完吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.229.55.170
1F:推 tomex:out关键字 03/30 10:49