当前位置: 首页 > news >正文

C#中多态性核心讲解

在 C# 中,‌多态性(Polymorphism)‌ 是面向对象编程(OOP)的核心概念之一,指同一操作作用于不同类的对象时,可以产生不同的行为。多态性允许通过统一的接口处理不同类型的对象,提高代码的灵活性和可扩展性。


多态的分类‌
C# 中的多态性分为两种形式:

  1. 编译时多态(静态多态)‌:通过方法重载(Overloading)和运算符重载实现,编译器在编译时确定具体调用哪个方法。

  2. 运行时多态(动态多态)‌:通过虚方法(virtual)、抽象类(abstract)和接口(interface)实现,具体调用的方法在运行时根据对象的实际类型决定。


‌多态的典型实现方式‌

  1. 方法重载(编译时多态)
public class Calculator {
    // 重载 Add 方法
    public int Add(int a, int b) => a + b;
    public double Add(double a, double b) => a + b;
}

调用时会根据参数类型自动选择对应方法:

var calc = new Calculator();
calc.Add(1, 2);       // 调用 int 版本
calc.Add(1.5, 2.5);   // 调用 double 版本
  1. 虚方法重写(运行时多态)
public class Animal {
    public virtual void MakeSound() {
        Console.WriteLine("Animal makes a sound");
    }
}

public class Dog : Animal {
    public override void MakeSound() {
        Console.WriteLine("Dog barks: Woof!");
    }
}

public class Cat : Animal {
    public override void MakeSound() {
        Console.WriteLine("Cat meows: Meow!");
    }
}

调用时根据对象的实际类型决定行为:

Animal animal1 = new Dog();
Animal animal2 = new Cat();

animal1.MakeSound();  // 输出 "Dog barks: Woof!"
animal2.MakeSound();  // 输出 "Cat meows: Meow!"
  1. 抽象类和抽象方法
public abstract class Shape {
    public abstract double Area(); // 抽象方法,子类必须实现
}

public class Circle : Shape {
    public double Radius { get; set; }
    public override double Area() => Math.PI * Radius * Radius;
}

public class Square : Shape {
    public double Side { get; set; }
    public override double Area() => Side * Side;
}

调用时通过基类引用调用具体实现:

Shape shape1 = new Circle { Radius = 3 };
Shape shape2 = new Square { Side = 4 };

Console.WriteLine(shape1.Area());  // 输出 28.2743...
Console.WriteLine(shape2.Area());  // 输出 16
  1. 接口多态
public interface IPayment {
    void ProcessPayment(double amount);
}

public class CreditCardPayment : IPayment {
    public void ProcessPayment(double amount) {
        Console.WriteLine($"Paid {amount} via Credit Card.");
    }
}

public class PayPalPayment : IPayment {
    public void ProcessPayment(double amount) {
        Console.WriteLine($"Paid {amount} via PayPal.");
    }
}

通过接口统一调用不同实现:

IPayment payment1 = new CreditCardPayment();
IPayment payment2 = new PayPalPayment();

payment1.ProcessPayment(100);  // 输出 "Paid 100 via Credit Card."
payment2.ProcessPayment(50);   // 输出 "Paid 50 via PayPal."

‌多态的核心优势‌

  • 代码复用‌:通过基类或接口统一操作不同类型的对象。
  • 扩展性‌:新增子类或实现类时无需修改现有代码(符合开闭原则)。
  • 灵活性‌:运行时动态绑定对象的具体行为。

通过合理使用多态性,可以显著提高代码的可维护性和可扩展性。

http://www.dtcms.com/a/68196.html

相关文章:

  • S7-1200 G2移植旧版本S7-1200程序的具体方法示例
  • 16003. orin camera 相机驱动源码 imx477分析记录
  • 直方图(信息学奥赛一本通-1115)
  • 几款可用于绘制工艺原理图的开源框架
  • flutter 专题 八十八 Flutter原生混合开发
  • MySQL 8 主从同步安装与配置
  • C语言实现括号匹配检查及栈的应用详解
  • C#—【在不同的场景该用哪种线程?】
  • 机器狗硬件设计踩坑实录
  • 【愚公系列】《高效使用DeepSeek》004-DeepSeek的产品形态和功能详解
  • 前端UnoCSS面试题及参考答案
  • Opencv之掩码实现图片抠图
  • 金融时间序列分析(Yahoo Finance API实战)
  • 《炎龙骑士团外传风之纹章》秘籍
  • Cadence学习笔记3
  • C++类的基础题(4)
  • MIPI电平标准详解
  • 【Spring Cloud】 核心组件全解析与 2024 【微服务框架】选型指南
  • 数据结构与算法——算法3 面试常用排序算法
  • Java的SPI机制详解
  • Android之RecyclerView列表拖动排序
  • printf 和 echo 区别
  • 解析富集分析中的过表达分析(ORA):原理、应用与优化
  • REST 请求返回 Invalid Credentials
  • Android wifi的开关Settings值异常分析
  • PCL 点云OBB包围盒(二)
  • 【Java篇】一法不变,万象归一:方法封装与递归的思想之道
  • golang算法二叉搜索树
  • 静态时序分析:SDC约束命令set_sense详解
  • ​​vue-router编程式导航,params传参拿不到