火炮 : 发布器类
三种坦克 : 订阅器类
火炮 内部只需要 基于 委托 定义一个事件,在main 中 向这个事件 按顺序 添加要测试(触发)的坦克。
就能实现 火炮击发的时候 自动攻击 这些外部添加的坦克。
using System;
using System.Linq;
namespace SimpleEvent
{
/***********发布器类***********/
public class 火炮
{
public delegate bool DecideAttack(int v);//委托
public event DecideAttack attack;//事件
public void Attack()
{
var r = new Random(DateTime.Now.Millisecond);
var v = r.Next(80, 300);
Console.WriteLine("用 {0} mm火炮进行攻击",v);
attack.Invoke(v);
Console.WriteLine("");
}
}
/***********订阅器类***********/
// 也就是事件处理者们
public class T34
{
string name = "T34";
int zj = 102;
public bool Decide(int v)
{
if (v >= zj)
{
Console.WriteLine("{0}\t被 击穿!", name);
return true;
}
else
{
Console.WriteLine("{0}\t未击穿", name);
return false;
}
}
}
public class M4A1
{
string name = "M4A1";
int zj = 63;
public bool Decide(int v)
{
if (v >= zj)
{
Console.WriteLine("{0}\t被 击穿!", name);
return true;
}
else
{
Console.WriteLine("{0}\t未击穿", name);
return false;
}
}
}
public class ZTZ99
{
string name = "ZTZ99";
int zj = 220;
public bool Decide(int v)
{
if (v >= zj)
{
Console.WriteLine("{0}\t被 击穿!", name);
return true;
}
else
{
Console.WriteLine("{0}\t未击穿", name);
return false;
}
}
class Program
{
static void Main(string[] args)
{
var player = new 火炮();
player.attack += new 火炮.DecideAttack(new T34().Decide);
player.attack += new 火炮.DecideAttack(new M4A1().Decide);
player.attack += new 火炮.DecideAttack(new ZTZ99().Decide);
foreach (var i in Enumerable.Range(0, 5))
{
player.Attack();
}
Console.ReadKey();
}
}
}
}
推荐想了解 事件概念的同学 复制该代码,自己试试。