C#中 类的多态

本文介绍了C#中实现多态性的三种主要方式:虚方法、抽象类与抽象方法及接口实现。通过具体的代码示例解释了如何使用虚方法和抽象类来实现不同类型的对象对同一方法的不同实现。
  • 在类的继承中,C#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,

    也就是说在基类与派生类的相同功能中可以有不同的实现方法,从而为解决同一问题提供多种途径。

  • 多态性就是指在程序运行时,执行的虽然是一个调用方法的语句,却可以根据派生类对象的类型的不同完成方法不同的具体实现
  • 在C#中可以通过多种途径实现多态性:

  1. 虚方法:将父类的方法标记为虚方法,使用关键字virtual,此方法在子类中可以重写(使用关键字override)

  2. 抽象类与抽象方法:如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法写成抽象方法,子类中的方法仍用关键字override重写。

  3. 接口实现:
  • 我们选择使用虚方法实现多态还是抽象方类抽象方法实现多态,取决于我们是否需要使用基类实例化的对象。

  • 抽象类:不需要使用基类实例化的对象

  • 虚方法:需要使用基类实例化的对象

  • 举例:

  1. 现有Clerk(基类),ProjectManager(继承类),此时需要使用虚方法来实现多态,因为我们需要使用Clerk创建的对象,这些对象是普通员工对象

    职员(Clerk)需要有工作计划,经理(ProjectManager)也需要有工作计划

   2. 现有Drink类作为基类,Milk,Tea类继承Drink,我们需要使用的是Milk和Tea创建对象,无需Drink创建对象,此时将Drink写成抽象类

    茶(Tea)可以饥渴,牛奶(Milk)也可以解渴————此时抽象出一个饮料(Drink)类作为基类

    

采用虚拟方法代码如下:

 1 class Clerk
 2 {
 3     public virtual void WorkPlan()    // 此处采用virtual方法
 4     {
 5          Console.WriteLine("我是职员,我需要有工作计划");
 6     }
 7 }    
 8 class ProjectManager:Clerk  // 继承于Clerk
 9  {
10         public override void WorkPlan()  // 用override进行重写
11         {
12             Console.WriteLine("我是经理,我也需要有工作计划");
13         }
14  }
15         
16 
17 class Program              
18 {
19       static void Main(string[] args)
20       {
21           Clerk myClerk = new Clerk();
22           ProjectManager myPM = new ProjectManager();
23           Clerk[] clerk = { myClerk, myPM };
24           foreach (Clerk outclerk in clerk)
25               outclerk.WorkPlan();
26           Console.ReadKey();     
27       }
28 }           

 采用抽象方法代码如下:

abstract class Drink
{
    public abstract void drink();   // 使用抽象化方法时,不能有方法体
}

class Milk:Drink
{
    public override void drink()
    {
        Console.WriteLine("我是牛奶,我可以解渴");
    }
}

class Tea:Drink
{
    public override void drink()
    {
        Console.WriteLine("我是茶,我可以解渴");
    }
}

 class Program
 {
    static void Main(string[] args)
    {

    Drink myMilk = new Milk();  // 此处注意抽象类Drink是不能进行实例化的
    Drink myTea = new Tea();
    Drink[] drink = { myMilk, myTea };
    foreach (Drink outDrink in drink)
        outDrink.drink();
    Console.ReadKey();
   }
}

 

转载于:https://www.cnblogs.com/lihq-sharefield/p/6822226.html

<think>多态是面向对象编程的三大特性之一(封装、继承、多态)。在C#中,多态允许不同的对象对同一消息做出不同的响应。具体来说,多态有两种主要形式: 1. 编译时多态(静态多态):通过方法重载和运算符重载实现。 2. 运行时多态(动态多态):通过虚方法(virtual)、抽象方法(abstract)和接口(interface)实现,在运行时根据对象的实际型调用相应的方法。 多态的主要作用: 1. 提高代码的可扩展性和可维护性:通过多态,我们可以编写出更通用的代码,这些代码可以处理现有和未来的新对象,只要它们遵循相同的接口或继承体系。 2. 实现接口与实现的分离:多态允许我们定义接口(或抽象)并让不同的子提供不同的实现,从而将“做什么”和“怎么做”分离开来。 3. 简化代码:通过多态,我们可以使用统一的接口操作不同的对象,从而减少条件语句(如if-else或switch)的使用。 下面通过一个具体的例子来展示C#多态的应用: 假设我们有一个图形(Shape)基,它有一个计算面积的方法。不同的图形(如圆形、矩形)计算面积的方法不同。我们可以利用多态来实现不同图形面积的计算。</think># C#多态的作用详解 多态是面向对象编程的三大核心特性之一(封装、继承、多态),在 C# 中扮演着至关重要的角色。**多态的核心作用是允许不同的对象对同一消息做出不同的响应,提高代码的灵活性和可扩展性**。 ## 多态的主要作用 1. **代码重用与扩展性** 通过多态,可以在不修改现有代码的情况下添加新功能 2. **接口统一** 不同对象可以通过相同接口进行操作 3. **运行时绑定** 在运行时根据对象实际型决定调用哪个方法 4. **解耦设计** 减少模块间的依赖关系,提高系统灵活性 ## 多态的实现方式 在 C# 中,主要通过以下方式实现多态: ### 1. 虚方法(Virtual Methods) ```csharp public class Shape { // 虚方法 - 可被子重写 public virtual void Draw() { Console.WriteLine("Drawing a generic shape"); } } public class Circle : Shape { // 重写父的虚方法 public override void Draw() { Console.WriteLine("Drawing a circle"); } } public class Square : Shape { public override void Draw() { Console.WriteLine("Drawing a square"); } } // 使用 Shape shape1 = new Circle(); Shape shape2 = new Square(); shape1.Draw(); // 输出: Drawing a circle shape2.Draw(); // 输出: Drawing a square ``` ### 2. 抽象与抽象方法(Abstract Classes) ```csharp public abstract class Animal { // 抽象方法 - 必须在子中实现 public abstract void MakeSound(); // 抽象可以有具体实现 public void Sleep() { Console.WriteLine("Zzz..."); } } public class Dog : Animal { public override void MakeSound() { Console.WriteLine("Woof! Woof!"); } } public class Cat : Animal { public override void MakeSound() { Console.WriteLine("Meow!"); } } // 使用 Animal[] animals = new Animal[] { new Dog(), new Cat() }; foreach (var animal in animals) { animal.MakeSound(); // 多态调用 } ``` ### 3. 接口(Interfaces) ```csharp public interface IPlayable { void Play(); } public class MusicPlayer : IPlayable { public void Play() { Console.WriteLine("Playing music..."); } } public class VideoPlayer : IPlayable { public void Play() { Console.WriteLine("Playing video..."); } } // 使用 IPlayable player1 = new MusicPlayer(); IPlayable player2 = new VideoPlayer(); player1.Play(); // 输出: Playing music... player2.Play(); // 输出: Playing video... ``` ## 多态的实际应用场景 1. **插件系统开发** 允许动态加载和调用不同插件 2. **GUI框架** 统一处理不同型的UI控件 3. **游戏开发** 处理不同型的游戏对象 4. **数据访问层** 支持多种数据库型 ## 多态的优势 1. **可扩展性** 添加新功能时无需修改现有代码 2. **可维护性** 减少代码重复,逻辑更清晰 3. **灵活性** 运行时决定对象行为 4. **代码复用** 通过基或接口定义通用行为 ## 多态 vs 方法重载 ```csharp // 编译时多态(方法重载) public class Calculator { public int Add(int a, int b) => a + b; public double Add(double a, double b) => a + b; } // 运行时多态(虚方法重写) public class Base { public virtual void Show() => Console.WriteLine("Base"); } public class Derived : Base { public override void Show() => Console.WriteLine("Derived"); } ``` ## 多态的最佳实践 1. **优先使用接口** 当需要多重继承时 2. **合理使用抽象** 当多个有共享实现时 3. **避免过度使用虚方法** 只在需要扩展点的地方使用 4. **遵循Liskov替换原则** 子应该能够替换父而不改变程序行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值