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

C# 的动态性多态说明

动态性多态:包含虚方法和抽象类;

一.虚方法的应用说明

虚方法是使用关键字 virtual 声明的,实现在类中定义的函数继承类的功能,虚方法可以在不同的继承类中有不同的实现,对虚方法的调用是在运行时发生的。

以下实例创建了 Shape 基类,并创建派生类 Circle、 Rectangle、Triangle, Shape 类提供一个名为 Draw 的虚拟方法,在每个派生类中重写该方法以绘制该类的指定形状。

using System;
using System.Collections.Generic;

public class Shape
{
    public int X { get; private set; }
    public int Y { get; private set; }
    public int Height { get; set; }
    public int Width { get; set; }
   
    // 虚方法
    public virtual void Draw()
    {
        Console.WriteLine("执行基类的画图");
    }
}

class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("画一个圆形");
        base.Draw();
    }
}
class Rectangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("画一个长方形");
        base.Draw();
    }
}
class Triangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("画一个三角形");
        base.Draw();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 创建一个 List<Shape> 对象,并向该对象添加 Circle、Triangle 和 Rectangle
        var shapes = new List<Shape>
        {
            new Rectangle(),
            new Triangle(),
            new Circle()
        };

        // 使用 foreach 循环对该列表的派生类进行循环访问,并对其中的每个 Shape 对象调用 Draw 方法 
        foreach (var shape in shapes)
        {
            shape.Draw();
        }

        Console.WriteLine("按下任意键退出。");
        Console.ReadKey();
    }

}

 二.抽象类的应用说明

C# 中使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现,抽象类包含抽象方法,抽象方法可被派生类实现。

抽象类的一些规则:

2.1不能创建一个抽象类的实例;

2.2不能在一个抽象类的外部声明一个抽象方法;

2.3通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承,抽象类不可以被声明为 sealed。

 abstract class Shape
   {
       abstract public int area();
   }
   class Rectangle:  Shape
   {
      private int length;
      private int width;
      public Rectangle( int a=0, int b=0)
      {
         length = a;
         width = b;
      }
      public override int area ()
      {
         Console.WriteLine("Rectangle 类的面积:");
         return (width * length);
      }
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle rectangle = new Rectangle(5, 6);
         double myarea = rectangle.area();
         Console.WriteLine("面积: {0}",myarea);
         Console.ReadKey();
      }
   } 

三.抽象方法和虚方法的区别

3.1虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。

3.2抽象方法只能在抽象类中声明,虚方法不是。如果类包含抽象方法,那么该类也是抽象的,也必须声明类是抽象的。

3.3抽象方法必须在派生类中重写,这一点和接口类似,虚方法不需要再派生类中重写。

简单说,抽象方法是需要子类去实现的,虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。抽象方法和虚方法都可以供派生类重写。

 


http://www.mrgr.cn/news/46214.html

相关文章:

  • AIP1668显示驱动3线串口共阴极10段7位或13段4位 LED驱动控制
  • 工业网关设备在智能制造中的应用有哪些?天拓四方
  • UE4 材质学习笔记05(凹凸偏移和视差映射/纹理压缩设置)
  • malloc(0)会返回什么?
  • vscode在执行py脚本时,输出的调试信息是乱码应该怎么办?
  • 【simulink仿真模型】Buck变换器闭环控制,电力电子仿真模型
  • 代码随想录第32天|
  • 大数据开发--1.3 Linux的常用命令大全
  • B2B2C商城用户友好界面设计思路
  • Squid + Stunnel 配置
  • 基于贝叶斯决策的 CAD 程序设计方案
  • 首批远程诊断与在线教育专家团队正式组建,助力心血管疾病早筛早治
  • 【取证工具大升级】云取、自助、介质取证:全面更新,性能飞跃!
  • Spring Boot学习资源库:构建你的技术宝库
  • Cursor创始团队的最新访谈,值得一读
  • 人工智能风险预警以及区块链解决方案探索
  • 解决应用程序启动失败问题:由于找不到d3dx9_43.dll文件,如何快速有效地恢复和修复缺失的DLL组件
  • 猿人学— 第一届第1题(解题思路附源码)
  • 上市公司企业平台生态嵌入数据(2001-2023年)
  • 中航资本:证券账户网上开户时,证券营业部要怎么选择?