C# 多态 weijiejue

静态多态

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

函数重载

同名不同参

运算符重载

动态多态

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

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

您不能创建一个抽象类的实例。
您不能在一个抽象类外部声明一个抽象方法。
通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed

总之,
类前声明abstruct就可以写出一个抽象类

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

在C#(以及其他一些面向对象的编程语言中),override是一个关键字,用于指示一个方法在派生类中覆盖了基类中的同名方法。这意味着,当你使用派生类的对象并调用这个方法时,将执行派生类中的版本,而不是基类中的版本。

要使用override关键字,必须满足以下条件:

基类中存在一个虚方法(virtual)或抽象方法(abstract):基类中必须有一个具有相同签名(即相同的名称、参数列表和返回类型)的虚方法或抽象方法。

派生类继承自基类:包含override方法的类必须是从包含被覆盖方法的类继承而来的。

方法签名匹配:派生类中的方法必须与基类中被覆盖的方法具有相同的签名。

访问修饰符不能比基类方法更严格:派生类中方法的访问修饰符(如publicprotectedinternal)不能比基类中被覆盖的方法更严格。例如,如果基类中的方法是public的,那么派生类中的覆盖方法也必须是public的。

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

相关推荐

  1. C# weijiejue

    2024-03-23 05:10:07       40 阅读
  2. <span style='color:red;'>C</span>++<span style='color:red;'>多</span><span style='color:red;'>态</span>

    C++

    2024-03-23 05:10:07      50 阅读
  3. 八股文 c++

    2024-03-23 05:10:07       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 05:10:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 05:10:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 05:10:07       87 阅读
  4. Python语言-面向对象

    2024-03-23 05:10:07       96 阅读

热门阅读

  1. 使用conda管理python环境

    2024-03-23 05:10:07       35 阅读
  2. Spark面试整理-如何创建RDD

    2024-03-23 05:10:07       46 阅读
  3. 使用conda创建python 虚拟环境

    2024-03-23 05:10:07       39 阅读
  4. RUST:Arc (Atomic Reference Counted) 原子引用计数

    2024-03-23 05:10:07       41 阅读
  5. Rust 语言的 HashMap

    2024-03-23 05:10:07       43 阅读
  6. Docker

    Docker

    2024-03-23 05:10:07      40 阅读
  7. RUST: let task = &mut task.unwrap().clone();

    2024-03-23 05:10:07       46 阅读
  8. jupyter | jupyter使用conda虚拟环境

    2024-03-23 05:10:07       42 阅读
  9. docker常用命令(不断更新)

    2024-03-23 05:10:07       38 阅读
  10. c语言教务成绩管理系统1000+

    2024-03-23 05:10:07       41 阅读
  11. mac 同步安卓手机屏幕

    2024-03-23 05:10:07       41 阅读
  12. 58.最后一个单词的长度

    2024-03-23 05:10:07       39 阅读
  13. 【力扣】387. 字符串中的第一个唯一字符

    2024-03-23 05:10:07       44 阅读
  14. 机器学习流程—数据分布不均处理

    2024-03-23 05:10:07       42 阅读
  15. 机器学习概念

    2024-03-23 05:10:07       40 阅读