使用冒号继承一个基类,子类扩展一个基类时,他会继承它的成员:也就是基类中的所有字段,属性和方法,他们会自动增加到子类
子类覆盖方法改变它继承的成员
- 基类中的方法增加virtual关键字
- 子类同名方法增加override关键字
子类使用base关键字访问它的基类
如
csharp
class Chamleon : Vwrtebrate
{
public override void Eat(Food morsel)
{
base.Eat(morsel);//调用基类方法
}
}
基类有有构造器时,子类需要调用这个基类的构造器
- 一个子类覆盖其基类中的一个方法时,总是调用子类中定义更特定的版本
抽象类
abstract class
- 抽象类可以有不完整的占位属性和方法,如一个属性只定义存储方法没有给出定义方法
- 只有抽象类才可以有抽象方法
- 抽象类不可以实例化
C#不允许多重继承
蜂巢管理系统
有一个Bee基类,4个继承的子类Queen,NectarCollector,HoneyManufacturer,EggCare
还有一个HoneyVault静态类,跟踪蜂巢的蜂蜜和花露
HoneyVaultr类,蜜蜂调用ConsumeHoney类消耗蜂蜜完成工作
csharp
namespace BeehiveManagementSystem
{
class HoneyVault
{
public const float NECTAR_CONVERSION_RATIO = 0.19f;
public const float LOW_LEVEL_WARNING = 10f;
private static float honey = 25f;
private static float nectar = 100f;
public static void CollectNectar(float amount)
{
if (amount > 0) nectar += amount;
}
public static void ConvertNectarToHoney(float amount)
{
float nectarToHoney = amount;
if (nectarToHoney > nectar) nectarToHoney = nectar;
nectar -= nectarToHoney;
honey += nectarToHoney * NECTAR_CONVERSION_RATIO;
}
public static bool ConsumeHoney(float amount)
{
if (honey >= amount)
{
honey -= amount;
return true;
}
else
{
return false;
}
}
public static string StatusReport
{
get
{
string status = $"{honey:0.0} units of honey\n" +
$"{nectar:0.0} units of nectar";
string warnings = "";
if (honey < LOW_LEVEL_WARNING) warnings +=
"\nLOW HONEY - ADD A HONEY MANUFACTURER";
if (nectar < LOW_LEVEL_WARNING) warnings +=
"\nLOW NECTAR - ADD A NECTAR COLLECTOR";
return status + warnings;
}
}
}
}
Bee为基类,我们希望它不被创建,所以使用abstract 创建
csharp
namespace BeehiveManagementSystem
{
abstract class Bee
{
public abstract float CostPerShift { get; }
public string Job { get; private set; }
public Bee(string job)
{
Job = job;
}
public void WorkTheNextShift()
{
if (HoneyVault.ConsumeHoney(CostPerShift))
{
DoJob();
}
}
protected abstract void DoJob();
}
}
机制-动态-美感框架(MDA)是一个用来理解游戏很好的工具
整个应用在一个反馈循环中
至此,我们就学习完了第六章,然后让我们复习一下本章讲了什么
- 如何使用继承
- 子类继承基类的方法和特性
- 抽象类
- 游戏设计方法(MDA)