• C# 第五章『面向对象』◆第7节:多态


             通过继承实现的不同对象调用相同的方法,表现出不同的行为,成为多态。C#中的每种类型都是多态的。当派生类从基类继承时,它会获得基类所有方法、字段、属性和事件。面向对象的语言适用虚方法表达多态。

           多态是面向对象程序设计的基本特征之一,它使得派生类的实例可以直接赋予基类的对象,然后直接通过这个对象调用派生类的方法。在C#中,类的多态性是通过在派生类中重写基类的虚方法实现的。

            在C#中,方法在默认情况下不是虚拟的,但(除构造函数外)可以显式地声明为virtual,在方法前面加上virtual关键字,则称该方法为虚方法。将方法定义为虚方法后,可以在派生类中重写虚方法重写虚方法需要使用override关键字,这样在调用方法时,可以调用对象类型的相应方法。

            备注:类中的成员字段和静态方法不能声明为virtual,因为virtual只对类中的实例函数和属性有意义。

            注意点:

    • 覆写和被覆写的方法必须有相同的可访问性。
    • 不能覆写static方法或非虚方法。
    • 方法、属性和索引器,以及另一种成员类型:事件,都可以被声明为virtual和override。
    1. class MyBaseClass//基类
    2. {
    3. virtual public void Print()
    4. }
    5. class MyDerivedClass:MyBaseClass//派生类
    6. {
    7. override public void Print()
    8. }
    9. //---------------------------------------override和public的位置可以互换
    10. public virtual void Test()
    11. {
    12. Console.WriteLine("虚方法");
    13. }
    14. public override void Test()
    15. {
    16. Console.WriteLine("虚方法重写");
    17. }
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace _20220806_1
    6. {
    7. public class Rectangle
    8. {
    9. protected double a, b;
    10. public Rectangle()
    11. {
    12. }
    13. public Rectangle(double a,double b)
    14. {
    15. this.a = a;
    16. this.b = b;
    17. }
    18. public virtual double Area()
    19. {
    20. return a * b;
    21. }
    22. }
    23. public class Cylinder:Rectangle
    24. {
    25. public Cylinder(double h,double r):base(h,r)
    26. {
    27. }
    28. public override double Area()
    29. {
    30. //return base.Area();
    31. return 2 * Math.PI * b * b + 2 * Math.PI * a * b;
    32. }
    33. }
    34. class Program
    35. {
    36. static void Main(string[] args)
    37. {
    38. Rectangle r = new Rectangle(1, 10);
    39. Cylinder c = new Cylinder(4, 2);
    40. Console.WriteLine("矩形面积:{0}", r.Area());
    41. Console.WriteLine("圆柱体表面积:{0}", c.Area());
    42. Console.ReadLine();
    43. }
    44. }
    45. }
    1. using System;
    2. namespace Demo
    3. {
    4. class Vehicle
    5. {
    6. string name; //定义字段
    7. public string Name //定义属性为字段赋值
    8. {
    9. get { return name; }
    10. set { name = value; }
    11. }
    12. public virtual void Move() //定义方法输出交通工具的形态
    13. {
    14. Console.WriteLine("{0}都可以移动", Name);
    15. }
    16. }
    17. class Train : Vehicle
    18. {
    19. public override void Move() //重写方法输出交通工具形态
    20. {
    21. Console.WriteLine("{0}在铁轨上行驶", Name);
    22. }
    23. }
    24. class Car : Vehicle
    25. {
    26. public override void Move() //重写方法输出交通工具形态
    27. {
    28. Console.WriteLine("{0}在公路上行驶", Name);
    29. }
    30. }
    31. class Program
    32. {
    33. static void Main(string[] args)
    34. {
    35. Vehicle vehicle = new Vehicle(); //创建Vehicle类的实例
    36. Train train = new Train(); //创建Train类的实例
    37. Car car = new Car(); //创建Car类的实例
    38. //使用基类和派生类对象创建Vehicle类型数组
    39. Vehicle[] vehicles = { vehicle, train, car };
    40. vehicle.Name = "交通工具"; //设置交通工具的名字
    41. train.Name = "火车"; //设置交通工具的名字
    42. car.Name = "汽车"; //设置交通工具的名字
    43. vehicles[0].Move(); //输出交通工具的形态
    44. vehicles[1].Move(); //输出交通工具的形态
    45. vehicles[2].Move(); //输出交通工具的形态
    46. Console.ReadLine();
    47. }
    48. }
    49. }

  • 相关阅读:
    2022年mvnrepository跳过人机验证
    嵌入式linux总线设备驱动模型分析
    IDEA上配置mysql
    playwright录制脚本
    Mac快速配置ADB环境变量
    信息论基础
    YOLOv10项目-服务器上运行
    为什么国家政府发的国债,被央行自己印的钱大量购买时,利率会降低呢?
    java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
    arcgis实现矢量数据的局部裁剪
  • 原文地址:https://blog.csdn.net/qq_45336030/article/details/126186603