雷林鹏分享:C# 多态性

  C# 多态性

  多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。

  多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。

  静态多态性

  在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:

  函数重载

  运算符重载

  运算符重载将在下一章节讨论,接下来我们将讨论函数重载。

  函数重载

  您可以在同一个范围内对相同的函数名有多个定义。函数的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数个数不同。不能重载只有返回类型不同的函数声明。

  下面的实例演示了几个相同的函数 print(),用于打印不同的数据类型:

  using System;

  namespace PolymorphismApplication

  {

  class Printdata

  {

  void print(int i)

  {

  Console.WriteLine("Printing int: {0}", i );

  }

  void print(double f)

  {

  Console.WriteLine("Printing float: {0}" , f);

  }

  void print(string s)

  {

  Console.WriteLine("Printing string: {0}", s);

  }

  static void Main(string[] args)

  {

  Printdata p = new Printdata();

  // 调用 print 来打印整数

  p.print(5);

  // 调用 print 来打印浮点数

  p.print(500.263);

  // 调用 print 来打印字符串

  p.print("Hello C++");

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Printing int: 5

  Printing float: 500.263

  Printing string: Hello C++

  动态多态性

  C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。

  请注意,下面是有关抽象类的一些规则:

  您不能创建一个抽象类的实例。

  您不能在一个抽象类外部声明一个抽象方法。

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

  下面的程序演示了一个抽象类:

  using System;

  namespace PolymorphismApplication

  {

  abstract class Shape

  {

  public abstract 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 r = new Rectangle(10, 7);

  double a = r.area();

  Console.WriteLine("面积: {0}",a);

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Rectangle 类的面积:

  面积: 70

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

  动态多态性是通过 抽象类 和 虚方法 实现的。

  下面的程序演示了这点:

  using System;

  namespace PolymorphismApplication

  {

  class Shape

  {

  protected int width, height;

  public Shape( int a=0, int b=0)

  {

  width = a;

  height = b;

  }

  public virtual int area()

  {

  Console.WriteLine("父类的面积:");

  return 0;

  }

  }

  class Rectangle: Shape

  {

  public Rectangle( int a=0, int b=0): base(a, b)

  {

  }

  public override int area ()

  {

  Console.WriteLine("Rectangle 类的面积:");

  return (width * height);

  }

  }

  class Triangle: Shape

  {

  public Triangle(int a = 0, int b = 0): base(a, b)

  {

  }

  public override int area()

  {

  Console.WriteLine("Triangle 类的面积:");

  return (width * height / 2);

  }

  }

  class Caller

  {

  public void CallArea(Shape sh)

  {

  int a;

  a = sh.area();

  Console.WriteLine("面积: {0}", a);

  }

  }

  class Tester

  {

  static void Main(string[] args)

  {

  Caller c = new Caller();

  Rectangle r = new Rectangle(10, 7);

  Triangle t = new Triangle(10, 5);

  c.CallArea(r);

  c.CallArea(t);

  Console.ReadKey();

  }

  }

  }

  当上面的代码被编译和执行时,它会产生下列结果:

  Rectangle 类的面积:

  面积:70

  Triangle 类的面积:

  面积:25

  本文转载自:w3cschool(编辑:雷林鹏 来源:网络)

转载于:https://www.cnblogs.com/pengpeng1208/p/10416605.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据的应用-UserCF和ItemCF推荐算法

一.推荐系统 1.1 推荐系统是大数据在互联网领域的典型应用,它可以通过分析用户的历史记录来了解用户的喜好,从而主动的为用户推荐其感兴趣的信息,满足用户的个性化推荐需求. 1.2 推荐系统是自动联系用户和物品的一种工具&#x…

计算机网络之Web应用

1、web与HTTP world Wide Web: 网页 网页互相链接 网页包含多个对象: 对象: HTML文件、JPEG图片、视频文件、动态脚本等 基本HTML文件: 包含对其他对象引用的链接 对象的寻址: URL(Uniform Resource Locato…

UI控件Telerik UI for WinForms发布R1 2019|附下载

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件。所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 【Telerik UI for WinForms R1 2019下载】新增&#xf…

HBase错误解决(启动Hbase出现错误的替换,启动hbase shell出现ERROR KeeperErrorCode=NoNode for /hbase/master)

1.问题描述 我查阅资料发现,网上很多人和我出现相同的错误,却没有一个可以解决的教程,于是我在解决了我的一个错误后就立即写了这篇文章,需要能帮到一些人,文章不一定对每个人都有效&#xff0c…

如何使用jmeter进行并发登录测试

第一种方案直接从数据库中获取账号和密码 1、设置线程数为20 ,我们的并发用户量就是20个用户同时登录 2、添加定时器 3、设置集合点,当用户数量达到20个的时候再同时请求进行登录操作 4、添加配置元件:JDBC Connection Configuration 5、添加…

云计算与分布式系统课程学习笔记(一)——云计算简介

大数据对于系统架构的需求 显式的需求 海量计算和存储快速计算 隐式的需求 数据的快速传输灵活性低成本 如何实现这些需求? 并行化(并行化的理念存在于计算机方方面面) 并行请求(分配给多个计算机)并行线程&…

DeepMind用神经网络求解MIP后,攻破运筹学只是时间问题?你想多了

来源:杉数科技作者:皇甫琦、葛冬冬、杉数科技COPT开发组Google的DeepMind团队最近官宣了一篇神经网络(Neural Networks)求解MIP论文。一石激起千层浪,在国内外的运筹优化社群引起了讨论。部分围观吃瓜群众纷纷表示:"This is …

计算机视觉-SIFT

一.SIFT(Scale Invariant Feature Transform) 算法 1.图像尺度空间 要让计算机能够对物体在不同尺度下有一个统一的认知,就要需要考虑图像在不同尺度(远近,大小,颜色区别等)下存在的特点.尺度空间的获取通常使用高斯模糊来实现&…

世界上最好的光刻机为什么来自荷兰?【物联网智商精选】

来源: 大数据实验室“是说芯语”已陪伴您439天现在微电子集成电路技术对世界的各种科技电子产品越来越应用广泛了,一个国家的发展越来越离不开高端芯片了,一个国家越是发展得越快对高端芯片需求量越大,比如我国的芯片需求占世界的50&#xff…

云计算与分布式系统课程学习笔记(二)——Linux基本命令的使用与熟悉

(1) jps 【显示当前系统的java进程情况,及其id号】 -q只显示pid,不显示class名称,jar文件名和传递给main方法的参数-m输出传递给main方法的参数-l输出主类的完整包名或者jar文件完整路径名-v输出传递给JVM的参数 编写一个JSPDemo…

【转】为了修复打码女神脸,他们提出二阶段生成对抗网络EdgeConnect

当图像缺失部分太多的时候,结合多阶段方法和边缘先验信息,这个 GAN 实现了高还原度的图像修复,玩法还不止于此。 在过去几年中,深度学习技术在图像修复方面取得了显着进步。然而,许多这些技术无法重建合理的结构&#…

QT跨平台项目开发经验(项目打包)

1.代码编写 1.1 代码编写简短,代码运行效率高,适当注释。一般一个大型的项目,代码的运行效率要求较高,一般需要秒级响应,甚至毫秒级。 1.2 建议使用命名空间::的形式来访问该命名空间中的变量和函数,这样可…

高等数学、线性代数、概率论、几何这些知识可以用来干什么?

来源:图灵人工智能应该会有很多模友在开始学习数学分析和高等数学时,第一反应是:但其实大多数人所用的教材,从大众角度看还没有到一种极致精确的架构数学的程度。大多数的教材所做的还是“我教会你怎么弄这个东西就行了&#xff0…

CentOS7 /etc/profile 添加环境变量重开终端后不生效

排查步骤如下: 查看/etc/profile里面的环境变量是否填写正确。 需要重启操作系统(很重要!!!) 将环境变量写入/etc/bashrc文件

C++类重点难点

1.构造函数与析构函数 1.1 在创建对象的时候会执行构造函数,对对象的成员属性进行初始话,在对象的生命周期结束时,执行析构函数; 1.2 设计到动态分配内存的时候,在构造函数中进行内存分配,在析构函数中进行…

CentOS7.7安装MySQL5.6并配置环境变量(详细版)

i. tar包下载 官网下载 https://dev.mysql.com/downloads/mysql/网盘获取 链接:https://pan.baidu.com/s/1DpULc0qQ4hqx6HWUwRilpw 提取码:tgdv ii. 安装所需环境 yum -y install make gcc-c cmake bison-devel ncurses-develiii. 解压tar包&#xf…

多少血的教训,才能换来对自动驾驶的严格限定、真实了解和正确使用?

来源:胡延平EarthRambler真的到了应该出台严格的安全措施的时候,而<道路交通安全法*修订建议稿>如何明确责任成为关从最新一起车祸的碰撞情况看,高速公路追尾卡车,雷达对前方目标的识别和驾驶系统的反应可能…

java并发编程-----深入剖析ThreadLocal

一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 这句…

QT动态连接库的编写

1.QT动态链接库的编写流程 1.1 首先在Qt Creator中创建一个动态连接库Matrix,添加类名,生成一个类(matrix.h和matrix.cpp)和一个matrix_global.h的文件,在matrix_global.h中可看到使用的导出宏,为MATRIXSHARED_EXPORT。如果只想导…

VMware下主机与虚拟机剪切板独立,无法直接复制粘贴

看了很多博客都说需要重新安装vmware tools,但我使用的是这种方法,亲测有效!!! 关闭虚拟机点击编辑虚拟机设置->选项选择客户机隔离,勾选上启动复制粘贴即可(如果之前就已经勾选上但失效的情…