美文网首页
{C#}干净的继承

{C#}干净的继承

作者: 码农猫爸 | 来源:发表于2023-11-18 18:43 被阅读0次

背景

  • 处理某项功能在多数子类共用,少数子类禁用。
  • 平衡代码量,安全性(误用|拥有他类成员,隐藏他类控件仍会误用),灵活性

客户代码

using static System.Console;

namespace CleanInheritance
{
    class Program
    {
        static readonly string _tiger = "Tiger", _swan = "Swan";

        static void Main(string[] args)
        {
            WriteLine("\nwrong case:");
            var tiger = new WrongAnimal(_tiger);
            tiger.Eat("deer");
            tiger.Run(100);
            var wrongSwan = new WrongAnimal(_swan);
            wrongSwan.Eat("grass");
            wrongSwan.Run(50);

            WriteLine("\nright case:");
            var rightTiger = new RightAnimal(_tiger);
            rightTiger.Eat("deer");
            rightTiger.Run(100);
            var rightSwan = new RightSwan(_swan);
            rightSwan.Eat("grass");
            rightSwan.Run(50);

            WriteLine("\nbetter case:");
            var betterTiger = new Beast(_tiger);
            betterTiger.Eat("deer");
            betterTiger.Run(100);
            var betterSwan = new Bird(_swan);
            betterSwan.Eat("grass");
            betterSwan.Fly(50);

            WriteLine("\nmore case:");
            var moreTiger = new MoreBeast(_tiger, new BeastSkill(_tiger));
            moreTiger.Eat("deer");
            moreTiger.Run(100);
            var moreSwan = new MoreBird(_swan, new BirdSkill(_swan));
            moreSwan.Eat("grass");
            moreSwan.Fly(50);
        }
    }
}

错误的处理

using static System.Console;

namespace CleanInheritance
{
    // 所有方法都归基类,由程序员(人)判断是否应该调用
    // 容易误调用,ex. swan.Run()
    // 代码量小,安全性差,灵活性差
    public class WrongAnimal
    {
        readonly string _name;

        public WrongAnimal(string name) => _name = name;

        public void Eat(string something)
            => WriteLine($"- {_name} is eating a/some {something}.");

        public void Run(int speed)
            => WriteLine($"- {_name} is running at {speed}km/h.");
    }
}

正确的处理

using static System.Console;

namespace CleanInheritance
{
    // 所有方法都归基类,但重写方法限制错误调用
    // 适用该方法公开
    // ex. swan.Run()时忽略|报错
    // 代码量中,安全性中,灵活性差
    public class RightAnimal
    {
        protected readonly string _name;

        public RightAnimal(string name) => _name = name;

        public void Eat(string something)
            => WriteLine($"- {_name} is eating a/some {something}.");

        public virtual void Run(int speed)
            => WriteLine($"- {_name} is running at {speed}km/h.");
    }

    public class RightSwan : RightAnimal
    {
        public RightSwan(string name) : base(name) { }

        // 忽略或报错
        public override void Run(int speed)
            => WriteLine($"- {_name} Ingore wrong skill.");
    }
}

更佳的处理

using static System.Console;

namespace CleanInheritance
{
    // 分配特有方法到子类,净化基类
    // 提升专有方法到技能类,并在构造器中传入,可完成更多孙类
    // 代码量大,安全性高,灵活性高
    public class BetterAnimal
    {
        protected readonly string _name;

        public BetterAnimal(string name) => _name = name;

        public void Eat(string something)
            => WriteLine($"- {_name} is eating a/some {something}.");
    }

    public class Beast : BetterAnimal
    {
        public Beast(string name) : base(name) { }

        public void Run(int speed)
            => WriteLine($"- {_name} is running at {speed}km/h.");
    }

    public class Bird : BetterAnimal
    {
        public Bird(string name) : base(name) { }

        public void Fly(int speed)
            => WriteLine($"- {_name} is flying at {speed}km/h.");
    }

    public class MoreBeast : BetterAnimal
    {
        readonly BeastSkill _skill;

        public MoreBeast(string name, BeastSkill skill) : base(name)
            => _skill = skill;

        public void Run(int speed) => _skill.Run(speed);
    }

    public class MoreBird : BetterAnimal
    {
        readonly BirdSkill _skill;

        public MoreBird(string name, BirdSkill skill) : base(name)
            => _skill = skill;

        public void Fly(int speed) => _skill.Fly(speed);
    }

    public class BeastSkill
    {
        readonly string _name;

        public BeastSkill(string name) => _name = name;

        public void Run(int speed)
            => WriteLine($"- {_name} is running at {speed}km/h.");
    }

    public class BirdSkill
    {
        readonly string _name;

        public BirdSkill(string name) => _name = name;

        public void Fly(int speed)
            => WriteLine($"- {_name} is flying at {speed}km/h.");
    }
}

相关文章

  • C#继承

    C#多重继承

  • 面向对象编程(三)-继承和多态

    继承: 继承 定义:在 C# 中,类可以继承自另一个类。衍生的类(子类)继承父类的方法和数据成员。 子类继承父类,...

  • C# 继承、多态、重载、重写

    继承 继承是面向对象的编程的一种基本特性。 借助继承,能够定义可重用(继承)、扩展或修改父类行为的子类。C# 和 ...

  • C#基础之继承与多态

    C# 只允许单一继承。多重继承可以通过接口达到。例子:class Parent{}class Child : Pa...

  • C#高级进阶-[构造/继承]方法

    Aitin原创稿件,转载请注明出处! C#语法进阶 <构造/继承>方法

  • C#学习笔记<三> 继承

    m_<:这里记录C#学习的笔记,基础的语法略去,重点在类、方法、继承三项。 1 类继承 2

  • C#类的继承

    继承是面向对象编程的三个主要特征之一。继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。派生类只能有一个...

  • C++小知识点

    1.C++中类可以多继承 即一个子类继承多个父类,而在C#和java中,可以多继承多个接口,但是不能多继承多个基类...

  • C# 继承 02

    声明 本文内容来自微软 MVP solenovex 的视频教程——真会C#?- 第3章 创建类型,大致和第 6 课...

  • C# 继承 01

    声明 本文内容来自微软 MVP solenovex 的视频教程——真会C#?- 第3章 创建类型,大致和第 5 课...

网友评论

      本文标题:{C#}干净的继承

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