• C# 核心8——多态


    1.多态Vob

    1.基本概念

    多态按字面的意思就是“多种状态”

    让继承同一父类的子类们 在执行相同方法时有不同的表现(状态)

    主要目的

    同一父类的对象 执行相同行为(方法)有不同的表现

    解决的问题

    让同一个对象有唯一行为的特征

    2.解决的问题

    1. class Father
    2. {
    3. public void SpeakName()
    4. {
    5. Console.WriteLine("Father的方法");
    6. }
    7. }
    8. class Son : Father
    9. {
    10. public new void SpeakName()
    11. {
    12. Console.WriteLine("Son的方法");
    13. }
    14. }

    3.多态的实现

    我们目前已经学过的多态

    编译时多态——函数重载,开始就写好的

    我们将学习的:

    运行时多态(vob,抽象函数,接口)

    我们今天学习vob

    v:virtual(虚函数

    o:override(重写)

    b:base(父类)

    1. class GameObject
    2. {
    3. public string name;
    4. public GameObject(string name)
    5. {
    6. this.name = name;
    7. }
    8. //虚函数 可以被子类重写
    9. public virtual void Atk()
    10. {
    11. Console.WriteLine("游戏对象进行攻击");
    12. }
    13. }
    14. class Player : GameObject
    15. {
    16. public Player(string name) : base(name)
    17. {
    18. }
    19. //重写虚函数
    20. public override void Atk()
    21. {
    22. //base的作用
    23. //代表父类 可以通过base来保留父类的行为
    24. //base.Atk();
    25. Console.WriteLine("玩家对象进行攻击");
    26. }
    27. }
    28. class Monster : GameObject
    29. {
    30. public Monster(string name) : base(name)
    31. {
    32. }
    33. public override void Atk()
    34. {
    35. base.Atk();
    36. Console.WriteLine("怪物对象进行攻击");
    37. }
    38. }

     4.多态的使用

    1. class Program
    2. {
    3. static void Main(string[] args)
    4. {
    5. Console.WriteLine("多态_vob");
    6. #region 解决的问题
    7. Father f = new Son();
    8. f.SpeakName();//Father的方法
    9. (f as Son).SpeakName();//Son的方法
    10. #endregion
    11. #region 多态的使用
    12. GameObject p = new Player("张三");
    13. p.Atk();//玩家对象进行攻击
    14. (p as Player).Atk();//玩家对象进行攻击
    15. GameObject m = new Monster("李四");
    16. m.Atk();//怪物对象进行攻击
    17. (m as Monster).Atk();//怪物对象进行攻击
    18. #endregion
    19. }
    20. }

    5.总结

    多态:让同一类型的对象,执行相同行为时有不同的表现

    解决的问题: 让同一对象有唯一的行为特征

    vob:

    v:virtual 虚函数

    o:override 重写

    b:base 父类

    v和o一定是结合使用的 来实现多态

    b是否使用根据实际需求 保留父类行为

    2.抽象类和抽象方法

    1.抽象类

    概念:被抽象关键字abstract修饰的类

    特点:

    1. 不能被实例化的类
    2. 可以包含抽象方法
    3. 继承抽象类必须重写其抽象方法
    1. abstract class Thing
    2. {
    3. //抽象类中 封装的所有知识点都可以在其中书写
    4. public string name;
    5. //可以在抽象类中写抽象函数
    6. }
    7. class Water : Thing
    8. {
    9. }

    2.抽象函数

    抽象函数  又叫 纯虚方法

    abstract关键字修饰的方法

    特点:

    1. 只能在抽象类中申明
    2. 没有方法体
    3. 不能是私有的
    4. 继承后必须实现 用override重写 
    1. abstract class Fruits
    2. {
    3. public string name;
    4. //抽象方法 是一定不能有函数体的
    5. public abstract void Bad();
    6. public virtual void Test()
    7. {
    8. //可以选择是否写逻辑
    9. }
    10. }
    11. class Apple : Fruits
    12. {
    13. public override void Bad()
    14. {
    15. }
    16. //虚方法是可以由我们子类选择性来实现的
    17. //抽象方法必须要实现
    18. public override void Test()
    19. {
    20. base.Test();
    21. }
    22. }
    23. class SuperApple : Apple
    24. {
    25. //虚方法和抽象方法 都可以被子类无限的 去重写
    26. public override void Bad()
    27. {
    28. base.Bad();
    29. }
    30. public override void Test()
    31. {
    32. base.Test();
    33. }
    34. }
    35. class Program
    36. {
    37. static void Main(string[] args)
    38. {
    39. //抽象类不能被实例化
    40. //Thing t = new Thing();
    41. //但是 可以遵循里氏替换原则 用父类容器装子类
    42. Thing t = new Water();
    43. }
    44. }

    3.总结

    抽象类 是被abstract修饰的类 不能被实例化 可以包含抽象方法

    抽象方法 没有方法体的纯虚方法 继承后必须去实现的方法

    注意:

            如何选择普通类还是抽象类

            不希望被实例化的对象,相对比较抽象的类可以使用的抽象类

            父类中的行为不太需要被实现的,只希望子类去定义具体的规则 可以选择 抽象类然后使用其中的抽象方法来定义规则

    作用:整体框架设计时 会使用

  • 相关阅读:
    B. Comparison String
    【无标题】
    Mac版AndroidStudio常用快捷键(汇总)
    java mock单测
    linux下下载部署nginx
    【Java 进阶篇】MySQL多表查询之外连接详解
    如何检测和克服MLOps中的模型漂移
    Openssl数据安全传输平台019:外联接口类的封装以及动态库的制作 - Bug未解决,感觉不是代码的问题
    【历史上的今天】7 月 30 日:现代电视先驱诞生;以太坊启动;80 年代最畅销的电脑品牌
    性能测试知识
  • 原文地址:https://blog.csdn.net/weixin_45274937/article/details/126584353