当前位置: 移动技术网 > IT编程>开发语言>c# > 深入理解c#多态

深入理解c#多态

2020年06月23日  | 移动技术网IT编程  | 我要评论
继承概念  多态:即一个接口,多个功能  同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果  多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函

继承概念

  多态:即一个接口,多个功能

  同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果

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

静态多态性

  在静态多态性中,函数的响应是在编译时发生的

  父类中如果有方法需要子类重写,可以将该方法标记为虚方法

  虚方法必须在父类中有实现,空实现也可以

  虚方法子类可以重写,也可以不重写

  实现静态多态性有两种方法;

    函数重载

    运算符重载

函数重载

  即在同一范围中对同一函数名的多重定义

  通过定义函数的传参的不同类型或数量进行区分

  在调用函数时,根据传的参数类型和数量判断调用名字相同的那个方法 

using system;

namespace 函数重载
{
  class printdata
  {
    void print(int i)
    {
      console.writeline("printing int: {0}", i);
    }

    void print(double f)
    {
      console.writeline("printing folat: {0}", f);
    }

    void print(string s)
    {
      console.writeline("printing string: {0}", s);
    }

    static void main(string[] args)
    {
      printdata p = new printdata();

      // 调用 print 来打印整数
      p.print(34);

      // 调用 print 来打印浮点数
      p.print(234.643);

      // 调用 print 来打印字符串
      p.print("hello tynam");

      console.readkey();

    }
  }
}

运行结果

运算符重载

  重定义或重载c#中内置的运算符

  通过关键字operator加运算符的符号来定义

  与其他函数一样,重载运算符有返回类型和参数列表

using system;

namespace 运算符重载
{
  class complex
  {
    public int x;
    public int y;
    public int z;
    public complex(int x, int y, int z)
    {
      this.x = x;
      this.y = y;
      this.z = z;
    }

    public static complex operator+(complex v1,complex v2)
    {
      return new complex(v1.x + v2.x,v1.y + v2.y,v1.z + v2.z);
    }

    public static complex operator /(complex v1, complex v2)
    {
      return new complex(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z);
    }
  }

  class program
  {
    static void main(string[] args)
    {
      complex v1 = new complex(1,20,31);
      complex v2 = new complex(5,6,7);
      complex v3 = v1 + v2;
      complex v4 = v1 / v2;
      console.writeline("x is {0} ; y is {1} ; z is {2}", v3.x, v3.y, v3.z);
      console.writeline("x is {0} ; y is {1} ; z is {2}", v4.x, v4.y, v4.z);
      console.readkey();
    }
  }
}

运行结果

可重载和不可重载运算符

  可以被重载的一元运算符:+、 -、 !、~、++、--

  可以被重载的二元运算符:+、 -、 *、 /、 %

  可以被重载的比较运算符:==、!=、<、>、<=、>=

  不能被直接重载的条件逻辑运算符:&&、||

  不能被重载的赋值运算符:+=、-=、*=、/=、 %=

  不能被重载的其他运算符:=、 .、 ?:, ->、 new、 is、sizeof、typeof

动态多态性

  在动态多态性中,函数的响应是在运行时发生的

  使用关键字abstract创建抽象类,用于提供接口的部分类的实现

  当一个派生类继承自该抽象类时,实现即完成

  抽象类包含抽象方法,抽象方法可被派生类实现

  抽象方法不允许有方法体的

  当一个子类继承抽象类时,必须把父类的所有抽象成员都重写;若子类也是一个抽象类,可以不写

  子类重写父类的方法,参数和返回值必须跟父类一样

  抽象方法不能用static修饰

  抽象类是有构造函数的,虽然不能被实例化

  抽象类标记abstract,不能有任何实现,不能有方法体

using system;

namespace 动态多态性
{
  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()
    {
      return (width * length);
    }
  }

  class rectangletester
  {
    static void main(string[] args)
    {
      rectangle r = new rectangle(2, 4);
      double a = r.area();
      console.writeline("rectanglearea is: {0}",a);
      console.readkey();
    }
  }

}

运行结果

以上就是深入理解c#多态的详细内容,更多关于c#多态的资料请关注移动技术网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • 如何使用C# 捕获进程输出

    intro很多时候我们可能会需要执行一段命令获取一个输出,遇到的比较典型的就是之前我们需要用 ffmpeg 实现视频的编码压缩水印等一系列操作,当时使用的是 f... [阅读全文]
  • 全面分析c# LINQ

    大家好,这是 [c#.net 拾遗补漏] 系列的第 08 篇文章,今天讲 c# 强大的 linq 查询。linq 是我最喜欢的 c# 语言特性之一。linq 是... [阅读全文]
  • C# DataTable常见用法汇总

    c# datatable 的常见用法:(1)新建数据表。(2)向表添加列。(3)设置表特定行与列的数据值。(4)将某行数据加入到表。(5)合并表。(6)复制表。... [阅读全文]
  • C# 如何解析获取Url参数值

    今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串。样... [阅读全文]
  • C# 实现dataGridView选中一行右键出现菜单的示例代码

    在窗体中添加datagridview控件和contextmenustrip1控件,修改datagridview属性,将contextmenustrip控件绑定d... [阅读全文]
  • WPF实现手风琴式轮播图切换效果

    WPF实现手风琴式轮播图切换效果

    本文实例为大家分享了wpf实现轮播图切换效果的具体代码,供大家参考,具体内容如下实现效果如下:步骤:1、自定义控件myimagecontrol实现图片的裁切和动... [阅读全文]
  • WPF实现3D翻牌式倒计时特效

    WPF实现3D翻牌式倒计时特效

    本文实例为大家分享了wpf实现3d翻牌式倒计时的具体代码,供大家参考,具体内容如下实现效果如下:思路:使用自定义控件,设置一个背板 mycardcontrolb... [阅读全文]
  • WPF实现平面三角形3D运动效果

    WPF实现平面三角形3D运动效果

    本文实例为大家分享了wpf实现平面三角形3d运动效果的具体代码,供大家参考,具体内容如下实现效果如下:思路:封装三角形三个顶点和路径的三角形类,图形渲染时同步更... [阅读全文]
  • WPF实现3D粒子波浪效果

    WPF实现3D粒子波浪效果

    本文实例为大家分享了wpf实现3d粒子波浪效果的具体代码,供大家参考,具体内容如下实现效果如下:步骤:1、3d粒子类particle.cs2、粒子系统parti... [阅读全文]
  • 谈谈c#中的索引器

    概念索引器(indexer) 允许类中的对象可以像数组那样方便、直观的被引用。当为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array... [阅读全文]
验证码:
移动技术网