关于C#知识讲解

你上班的公司做了一套相当成功的模拟蛋仔的游戏: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();
            // …… 其它的行为实例略
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值