[問題] 互相持有reference的物件
這個範例是我自己想出來的一個簡單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
推
03/30 10:49, , 1F
03/30 10:49, 1F
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章