首页 > 编程语言 >2024-11-15《继续c#学习-多态性》

2024-11-15《继续c#学习-多态性》

时间:2024-12-29 14:46:42浏览次数:5  
标签:11 Box 15 多态性 WriteLine Console Box1 public Box2

多态性

静态多态性

函数重载

  函数重载就是一个函数可以通过传入不同的参数来进行不同的运算,例如:

  using System;
  namespace PolymorphismApplication
  {
  public class TestData
  {
  public int Add(int a, int b, int c)
  {
  return a + b + c;
  }
  public int Add(int a, int b)
  {
  return a + b;
  }
  }
  class Program
  {
  static void Main(string[] args)
  {
  TestData dataClass = new TestData();
  int add1 = dataClass.Add(1, 2);
  int add2 = dataClass.Add(1, 2, 3);
   
  Console.WriteLine("add1 :" + add1);
  Console.WriteLine("add2 :" + add2);
  }
  }
  }

运算符重载

  用法与函数重载相同:

  using System;
  namespace PolymorphismApplication
  {
  class Printdata
  {
  void print(int i)
  {
  Console.WriteLine("输出整型: {0}", i );
  }
   
  void print(double f)
  {
  Console.WriteLine("输出浮点型: {0}" , f);
  }
   
  void print(string s)
  {
  Console.WriteLine("输出字符串: {0}", s);
  }
  static void Main(string[] args)
  {
  Printdata p = new Printdata();
  // 调用 print 来打印整数
  p.print(1);
  // 调用 print 来打印浮点数
  p.print(1.23);
  // 调用 print 来打印字符串
  p.print("Hello Runoob");
  Console.ReadKey();
  }
  }
  }

动态多态性

  可以通过abstract关键字来创建一个抽象类,里面有抽象方法,可以被派生类实现。

  我们也可以用sealed关键字来实现密封,密封之后的类不能够被继承且无法使用抽象类。

  using System;
  namespace PolymorphismApplication
  {
  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 r = new Rectangle(10, 7);
  double a = r.area();
  Console.WriteLine("面积: {0}",a);
  Console.ReadKey();
  }
  }
  }

  如果我们想在继承类里实现基类的方法,可以用虚方法,关键字virtual来实现。

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

  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();
  }
   
  }

运算符重载

  运算符重载在我看来就是让运算更加的方便省事,可以节省代码。

image-20221014160122665

  举个例子:

  using System;
   
  namespace OperatorOvlApplication
  {
  class Box
  {
  private double length; // 长度
  private double breadth; // 宽度
  private double height; // 高度
   
  public double getVolume()
  {
  return length * breadth * height;
  }
  public void setLength( double len )
  {
  length = len;
  }
   
  public void setBreadth( double bre )
  {
  breadth = bre;
  }
   
  public void setHeight( double hei )
  {
  height = hei;
  }
  // 重载 + 运算符来把两个 Box 对象相加
  public static Box operator+ (Box b, Box c)
  {
  Box box = new Box();
  box.length = b.length + c.length;
  box.breadth = b.breadth + c.breadth;
  box.height = b.height + c.height;
  return box;
  }
   
  public static bool operator == (Box lhs, Box rhs)
  {
  bool status = false;
  if (lhs.length == rhs.length && lhs.height == rhs.height
  && lhs.breadth == rhs.breadth)
  {
  status = true;
  }
  return status;
  }
  public static bool operator !=(Box lhs, Box rhs)
  {
  bool status = false;
  if (lhs.length != rhs.length || lhs.height != rhs.height
  || lhs.breadth != rhs.breadth)
  {
  status = true;
  }
  return status;
  }
  public static bool operator <(Box lhs, Box rhs)
  {
  bool status = false;
  if (lhs.length < rhs.length && lhs.height
  < rhs.height && lhs.breadth < rhs.breadth)
  {
  status = true;
  }
  return status;
  }
   
  public static bool operator >(Box lhs, Box rhs)
  {
  bool status = false;
  if (lhs.length > rhs.length && lhs.height
  > rhs.height && lhs.breadth > rhs.breadth)
  {
  status = true;
  }
  return status;
  }
   
  public static bool operator <=(Box lhs, Box rhs)
  {
  bool status = false;
  if (lhs.length <= rhs.length && lhs.height
  <= rhs.height && lhs.breadth <= rhs.breadth)
  {
  status = true;
  }
  return status;
  }
   
  public static bool operator >=(Box lhs, Box rhs)
  {
  bool status = false;
  if (lhs.length >= rhs.length && lhs.height
  >= rhs.height && lhs.breadth >= rhs.breadth)
  {
  status = true;
  }
  return status;
  }
  public override string ToString()
  {
  return String.Format("({0}, {1}, {2})", length, breadth, height);
  }
   
  }
   
  class Tester
  {
  static void Main(string[] args)
  {
  Box Box1 = new Box(); // 声明 Box1,类型为 Box
  Box Box2 = new Box(); // 声明 Box2,类型为 Box
  Box Box3 = new Box(); // 声明 Box3,类型为 Box
  Box Box4 = new Box();
  double volume = 0.0; // 体积
   
  // Box1 详述
  Box1.setLength(6.0);
  Box1.setBreadth(7.0);
  Box1.setHeight(5.0);
   
  // Box2 详述
  Box2.setLength(12.0);
  Box2.setBreadth(13.0);
  Box2.setHeight(10.0);
   
  // 使用重载的 ToString() 显示两个盒子
  Console.WriteLine("Box1: {0}", Box1.ToString());
  Console.WriteLine("Box2: {0}", Box2.ToString());
   
  // Box1 的体积
  volume = Box1.getVolume();
  Console.WriteLine("Box1 的体积: {0}", volume);
   
  // Box2 的体积
  volume = Box2.getVolume();
  Console.WriteLine("Box2 的体积: {0}", volume);
   
  // 把两个对象相加
  Box3 = Box1 + Box2;
  Console.WriteLine("Box3: {0}", Box3.ToString());
  // Box3 的体积
  volume = Box3.getVolume();
  Console.WriteLine("Box3 的体积: {0}", volume);
   
  //comparing the boxes
  if (Box1 > Box2)
  Console.WriteLine("Box1 大于 Box2");
  else
  Console.WriteLine("Box1 不大于 Box2");
  if (Box1 < Box2)
  Console.WriteLine("Box1 小于 Box2");
  else
  Console.WriteLine("Box1 不小于 Box2");
  if (Box1 >= Box2)
  Console.WriteLine("Box1 大于等于 Box2");
  else
  Console.WriteLine("Box1 不大于等于 Box2");
  if (Box1 <= Box2)
  Console.WriteLine("Box1 小于等于 Box2");
  else
  Console.WriteLine("Box1 不小于等于 Box2");
  if (Box1 != Box2)
  Console.WriteLine("Box1 不等于 Box2");
  else
  Console.WriteLine("Box1 等于 Box2");
  Box4 = Box3;
  if (Box3 == Box4)
  Console.WriteLine("Box3 等于 Box4");
  else
  Console.WriteLine("Box3 不等于 Box4");
   
  Console.ReadKey();
  }
  }
  }

标签:11,Box,15,多态性,WriteLine,Console,Box1,public,Box2
From: https://www.cnblogs.com/dmx-03/p/18638804

相关文章

  • 2024-11-14《继续c#学习》
     今天进行了C#的学习,继续了解C#的相关知识: 目录继承多态性静态多态性函数重载运算符重载动态多态性运算符重载接口 继承  继承就是基类派生出去多种类,就好比狗是哺乳动物,狗是派生类,哺乳动物是基类。  下面是一个简单的继承: usingSystem;......
  • 2024-11-18《命名与预处理指令学习》
    命名空间  命名空间在基础的C#代码里就有使用,使用关键字namespace,我们可以通过调用其后面的命名空间里的类来进行操作。using关键字  通过using关键字,我们可以将上述的namespace来进行简化,可以直接使用里面的类来进行操作。嵌套命名空间  我们可以使用嵌套命名空间,可以......
  • 2024-11-20《文件的输入与输出》
    文件的输入与输出I/O类FileStream类  下面是一个FileSteam类的操作示例: usingSystem; usingSystem.IO;   namespaceFileIOApplication { classProgram { staticvoidMain(string[]args) { FileStreamF=new......
  • 2024-11-19《学习定位点与限定符》
    定位点分组构造限定符反向引用构造备用构造替换杂项构造Regex类  示例: usingSystem; usingSystem.Text.RegularExpressions;   namespaceRegExApplication { classProgram { privatestaticvoidshowMatch(stri......
  • c++11新特性
    智能指针1.管理内存释放问题2.共享所有权和转移//用的最多,内涵一个指向计数器,计数器归0的时候,释放对应的内存//指针本身在栈里面存储,指向的内容是放在堆里面的,栈可以自动释放,堆不可以shared_ptr//检测内存有没有被释放,被释放了就不用了,没被释放才做一些操作weak_ptr//纯......
  • Windows11安装Linux子系统(WSL2)
    1、确认BIOS中已经打开虚拟化VirtualizationTechnology(我的机器默认已经打开Enabled/Disabled,主板不同进入的地方不一样,自行搜索)2、以管理员身份打开PowerShell3、输入(此步安装WSL):dism.exe/online/enable-feature/featurename:Microsoft-Windows-Subsystem-Linux/......
  • Win11系统提示找不到Windows.Media.MixedRealityCapture.dll文件的解决办法
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • Win11系统提示找不到Windows.Media.Speech.dll文件的解决办法
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • 118. Web前端网页案例——【黑色的电影主题网页( 4页)】 大学生期末大作业 html+css+js
    目录一、网页概述二、网页文件三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐♬♬♬欢迎光临我的CSDN!这里是Web前端网页案例大集汇,有各行各业的前端网页案例,每天会持续更新!如果你对Web前端......
  • 2024-2025-1 学号20241315《计算机基础与程序设计》第十四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标<写上具体方面>《C语言程序设计》第13-14章并完成云班课测试作业正文https://www.cnbl......