我现在用EVE游戏中飞船的关系来对abstract、virtual、override这3个关键字举例。
先看下类关系图:
Spacecraft为所有飞船的基类。
Caldari(加达里)、Amarr(艾玛)是两个种族(不同的种族之间,武器和防御种类方法不一样,属性加成也不一样)。
Drake、Hawk是Caldari族的两艘飞船;Vengeance是Amarr族的飞船。

业务描述:
首先飞船基类拥有一个所有飞船速度的基数,不同种族的飞船对于速度的基数有各自的加成。
每个种族的武器系统、防御系统均不相同。但实施的效果相同,都是攻击、防御。
对于某个种族的飞船,均拥有自己的名字,在种族速度修正基础上,继续累加自己的速度倍数。更细化属于自己种族的武器分类。
/// <summary>
/// 飞船基类
/// </summary>
public abstract class Spacecraft
{
/// <summary>
/// 名称
/// </summary>
protected string _name;
/// <summary>
/// 速度基准值
/// </summary>
private const double _baseSpeed = 100;
protected virtual double BaseSpeed
{
get { return _baseSpeed; }
} 
public virtual string Name
{
get { return _name; }
}
public override string ToString()
{
return "名称:" + Name + "\r\n速度:" + BaseSpeed + "m/s \r\n武器系统:" + WeaponsSystem() + "\r\n防御系统:" + DefenseSystem() + "\r\n";
}
/// <summary>
/// 武器配置
/// </summary>
/// <returns></returns>
protected abstract string WeaponsSystem();
/// <summary>
/// 防御配置
/// </summary>
/// <returns></returns>
protected abstract string DefenseSystem();
}
/// <summary>
/// Caldari种族
/// </summary>
public abstract class Caldari : Spacecraft
{
public override string Name
{
get { return "Caldari族 " + _name; }
}
protected override double BaseSpeed
{
get { return VelocityCorrection() > 0 ? base.BaseSpeed * 1.4 * VelocityCorrection() : base.BaseSpeed * 1.4; }
}
/// <summary>
/// 速度值校准倍数
/// </summary>
/// <returns>校准倍数</returns>
protected virtual double VelocityCorrection()
{
return 1;
}
protected override string WeaponsSystem()
{
return "导弹类:" + MissileType();
}
protected abstract string MissileType();
protected override string DefenseSystem()
{
return "能量护盾";
}
}

public class Hawk : Caldari
{
public Hawk()
{
_name = "小鹰级";
}
protected override double VelocityCorrection()
{
return 5;
}
protected override string MissileType()
{
return "火箭、轻型导弹";
}
}
public class Drake : Caldari
{
public Drake()
{
_name = "幼龙级";
}
protected override string MissileType()
{
return "重型导弹、重型攻击导弹";
}
protected override double VelocityCorrection()
{
return 2;
}
}
/// <summary>
/// Amarr 种族
/// </summary>
public abstract class Amarr :Spacecraft
{
public override string Name
{
get { return "Amarr族 " + _name; }
}
protected override double BaseSpeed
{
get { return VelocityCorrection() > 0 ? base.BaseSpeed * 1.1 * VelocityCorrection() : base.BaseSpeed * 1.1; }
}
protected virtual double VelocityCorrection()
{
return 1;
}
protected override string WeaponsSystem()
{
return "激光类:" + LaserType();
}
protected abstract string LaserType();
protected override string DefenseSystem()
{
return "装甲";
}
}
public class Vengeance : Amarr
{
public Vengeance()
{
_name = "复仇级";
}

protected override string LaserType()
{
return "电磁、热能";
}
}
class Test
{
static void Main(string[] args)
{
Spacecraft hawk = new Hawk();
Console.WriteLine(hawk.ToString());
Spacecraft drake = new Drake();
Console.WriteLine(drake.ToString());
Spacecraft vengeance = new Vengeance();
Console.WriteLine(vengeance.ToString());
}
}分析:
所有飞船基类:拥有2个字段(名字、基础速度常量),2个虚访问器(获得名字、速度),2个抽象方法(武器系统、防御系统),展示飞船(重写toString()方法)。
Caldari族(抽象类):继承基类,重写了获得名字和速度的访问器(在名字前面加上种族名称,在基础速度上提高1.4倍作为种族特性。) 实现了武器系统方法(导弹类),并再定义1个导弹抽象方法,定义飞船速度校准虚方法(默认返回1倍)。
Hawk:继承Caldari族,定义构造方法为_name赋值,实现导弹的抽象方法,定义具体导弹名称,重写速度校准倍数为:在种族基础上的5倍。
运行结果:



浙公网安备 33010602011771号