首页新闻招聘找找看知识库
  • 浏览:66 2015-05-23 22:44 来自 iiRecord

    阅读设计模式第二版中的第二章-里氏替换原则碰见了疑问,具体是在 page12 关于新增的玩具枪的需求。作者指玩具枪不是杀人的,所以不能用 shoot 接口,然后提出了两种解决办法,第二种解决办法作者说 “为 ToyGun 脱离继承(AbstractGun),建立一个独立的基类,为了实现代码复用,可以与 AbstractGun 建立关联委托关系”。由于作者没有写具体的实现,我自己想不出有什么好的复用方式。

    using System;
    
    
    abstract class AbstractGun {
        public abstract void shoot();
    }
    
    class Machinegun : AbstractGun {
        public override void shoot()
        {
            Console.WriteLine("Machinegun shoot now");
        }
    }
    
    class Rifle : AbstractGun {
        public override void shoot()
        {
            Console.WriteLine("Rifle shoot now");
        }    
    }
    
    class Handgun : AbstractGun {
        public override void shoot()
        {
            Console.WriteLine("Handgun shoot now");
        }    
    }
    
    class Soldier {
        private AbstractGun gun_;
    
        public void SetGun(AbstractGun gun)
        {
            gun_ = gun;
        }
    
        public void kill()
        {
            Console.WriteLine("kill now");
            gun_.shoot();
        }
    }
    
    class Entry {
        static void Main()
        {
            Soldier[] s = new Soldier[3];
            s[0] = new Soldier();
            s[0].SetGun(new Machinegun());
            s[1] = new Soldier();
            s[1].SetGun(new Rifle());
            s[2] = new Soldier();
            s[2].SetGun(new Handgun());
    
            foreach (var v in s) {
                v.kill();
            }
        }
    }

    C# 如图所示,Soldier 中存储的变量类型是 AbstractGun ,我想不出 AbstractGun 和 新的基类如何关联达到代码复用。或者我理解的方向不对,请指点迷津奥。

     

     

登录后才能评论,请先登录注册