你上班的公司做了一套相当成功的模拟蛋仔的游戏:SimEggs。游戏中会出现各种蛋仔,蛋仔的种类及属性如下: 种类:绿头蛋仔、红头蛋仔、橡皮蛋仔、诱饵蛋仔……不确定什么时候上线新类型蛋仔。 属性:外观、游泳行为、飞行行为、狮吼行为……也不确定新行为。 不同种类的蛋仔所对应的属性如下: 由于不同种类的蛋仔可能具有不同的行为,因此,可以使如何利用多态来实现? 绿头蛋仔:绿头蛋仔的外观、会游泳、会飞行、呱呱叫。 红头蛋仔:红头蛋仔的外观、会游泳、会飞行、呱呱叫。 橡皮蛋仔:橡皮蛋仔的外观、会游泳(漂浮)、不会飞行、吱吱叫。 诱饵蛋仔:诱饵蛋仔的外观、会游泳(漂浮)、不会飞行、不会叫。 ……未来可能会有好多好多的新物种,新行为……
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EggGame
{
// 所有蛋仔角色的基类,定义为抽象类,
public abstract class Egg
{
// 只允许派生类能访问,所有的具体行为都可以用接口IBehavior去定义,因为它们都是此接口的实现
protected IBehavior swimBehavior;
protected IBehavior flyBehavior;
protected IBehavior soundBehavior;
protected IBehavior rollBehavior;
// …… 游戏中的角色行为种类还有很多,此处略
// 通过方法来给单仔的行为赋于对应的实现
public void SetSwimBehavior(IBehavior swim)
{
swimBehavior = swim;
}
public void SetFlyBehavior(IBehavior fly)
{
flyBehavior = fly;
}
public void SetSoundBehavior(IBehavior sound)
{
soundBehavior = sound;
}
public void SetRollBehavior(IBehavior roll)
{
rollBehavior = roll;
}
// 行为操作
// 显示蛋仔的信息
public abstract void Display();
// 核心行为方法的调用
public void Swim()
{
swimBehavior.PerformBehavior();
}
public void Fly()
{
flyBehavior.PerformBehavior();
}
public void Sound()
{
soundBehavior.PerformBehavior();
}
public void Roll()
{
rollBehavior.PerformBehavior();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EggGame
{
class Program
{
static void Main(string[] args)
{
var redheadEgg = new RedHeadEgg();
// 具体的新的行为可以在加载具体蛋仔角色时设置给此蛋仔
//redheadEgg.SetSoundBehavior(new BabyFestivalSound());
redheadEgg.Display();
redheadEgg.Fly();
redheadEgg.Swim();
redheadEgg.Sound();
redheadEgg.Roll();
Console.WriteLine();
var megg = new MachineEgg();
//megg.SetSoundBehavior(new BabyFestivalSound());
megg.Display();
megg.Fly();
megg.Swim();
megg.Sound();
megg.Roll();
Console.ReadKey();
}
}
}
namespace EggGame
{
public class MachineEgg : Egg
{
public string Name { get; set; }
public override void Display()
{
Console.WriteLine($"{Name}:我来罗!");
}
public MachineEgg()
{
Name = "机械蛋仔";
// 行为实现的初始化
swimBehavior = new CanNotSwim();
flyBehavior = new FlyWithEngine();
soundBehavior = new NormalSound();
rollBehavior = new RollWithEngine();
// …… 其它的行为实例略
}
}
}
namespace EggGame
{
/// <summary>
/// 普通的飞的行为
/// </summary>
public class NormalFly : IBehavior
{
public void PerformBehavior()
{
Console.WriteLine("蛋仔用翅膀飞.");
}
}
}
namespace EggGame
{
/// <summary>
/// 普通翻滚的实现
/// </summary>
public class NormalRoll : IBehavior
{
public void PerformBehavior()
{
Console.WriteLine("蛋仔向前滚.");
}
}
}
namespace EggGame
{
public class NormalSound : IBehavior
{
/// <summary>
/// 普通的发声行为
/// </summary>
public void PerformBehavior()
{
Console.WriteLine("蛋仔呱呱叫.");
}
}
}
namespace EggGame
{
/// <summary>
/// 普通的游泳的行为
/// </summary>
public class NormalSwim : IBehavior
{
public void PerformBehavior()
{
Console.WriteLine("蛋仔狗刨式游泳.");
}
}
}
namespace EggGame
{
// 所有行为的接口
public interface IBehavior
{
// 行为展示的方法
// 【接口中只能定义方法,不能有访问修饰符,方法只有定义没有实现】
void PerformBehavior();
}
}
namespace EggGame
{
/// <summary>
/// 红头蛋仔类
/// </summary>
public class RedHeadEgg : Egg
{
public string Name { get; set; }
public override void Display()
{
Console.WriteLine($"{Name}:我来罗!");
}
public RedHeadEgg()
{
Name = "红头蛋仔";
// 行为实现的初始化
swimBehavior = new NormalSwim();
flyBehavior = new NormalFly();
soundBehavior = new NormalSound();
rollBehavior = new NormalRoll();
// …… 其它的行为实例略
}
}
}