美文网首页
{C#}重写还是策略注入

{C#}重写还是策略注入

作者: 码农猫爸 | 来源:发表于2023-08-06 16:10 被阅读0次

汇总

  • 抽象方法:子类中必须重写
  • 虚拟方法:基类中定义默认方法,子类选择重写
  • 虚拟方法中备用代码:避免重复重写,但限定子类使用
  • 策略注入:重写部分作为策略注入,逻辑清晰且避免重复

抽象方法

using static System.Console;

namespace OverrideMethod
{
    abstract class AbstractAninal
    {
        // 无默认行为,全部子类中重写
        public abstract void Do();
    }

    class AbstractBird : AbstractAninal
    {
        public override void Do() => WriteLine("I am a bird");
    }

    class AbstractFish : AbstractAninal
    {
        public override void Do() => WriteLine("I am a fish");
    }
}

虚拟方法

using static System.Console;

namespace OverrideMethod
{
    class VirtualAninal
    {
        // 默认行为,子类按需重写
        public virtual void Do() => WriteLine("I am a bird");
    }

    class VirtualBird : VirtualAninal
    {
        // 采用默认行为,不必重写
    }

    class VirtualFish1 : VirtualAninal
    {
        // 重写非默认行为
        public override void Do() => WriteLine("I am a fish");
    }

    class VirtualFish2 : VirtualAninal
    {
        // 重写非默认行为
        // 但与VirtualFish1重复
        public override void Do() => WriteLine("I am a fish");
    }
}

虚拟方法中共用代码

using static System.Console;

namespace OverrideMethod
{
    class ReadyVirtualAninal
    {
        // 默认行为,子类按需重写
        public virtual void Do() => WriteLine("I am a bird");

        // 仅限鱼子类使用,产生混淆
        protected void DoLikeAFish()=> WriteLine("I am a fish");
    }

    class ReadyVirtualBird : ReadyVirtualAninal
    {
        // 采用默认行为,不必重写
    }

    class ReadyVirtualFish1 : ReadyVirtualAninal
    {
        // 借用基类行为
        public override void Do() => DoLikeAFish();
    }

    class ReadyVirtualFish2 : ReadyVirtualAninal
    {
        // 借用基类行为
        public override void Do() => DoLikeAFish();
    }
}

策略注入

using static System.Console;

namespace OverrideMethod
{
    // 引入策略接口,解决具体策略的重复使用问题
    interface IStrategy
    {
        void Do();
    }

    class BirdStrategy : IStrategy
    {
        public void Do() => WriteLine("I am a bird");
    }

    class FishStrategy : IStrategy
    {
        public void Do() => WriteLine("I am a fish");
    }

    class StrategyAninal
    {
        private readonly IStrategy _strategy;

        // 内联策略改为注入
        public StrategyAninal(IStrategy s) => _strategy = s;

        public void Do() => _strategy.Do();
    }

    class StrategyBird : StrategyAninal
    {
        public StrategyBird(IStrategy s) : base(s) { }
    }

    class StrategyFish1 : StrategyAninal
    {
        public StrategyFish1(IStrategy s) : base(s) { }
    }

    class StrategyFish2 : StrategyAninal
    {
        public StrategyFish2(IStrategy s) : base(s) { }
    }
}

客户代码

namespace OverrideMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            var abstractFish = new AbstractFish();
            abstractFish.Do();

            var virtualFish = new VirtualFish2();
            virtualFish.Do();

            var readyFish = new ReadyVirtualFish2();
            readyFish.Do();

            var strategyFish = new StrategyFish2(new FishStrategy());
            strategyFish.Do();
        }
    }
}

相关文章

网友评论

      本文标题:{C#}重写还是策略注入

      本文链接:https://www.haomeiwen.com/subject/xrhwpdtx.html