我现在用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倍。

运行结果:

 

 

posted on 2009-11-25 01:24  林博然  阅读(790)  评论(2编辑  收藏  举报