位置:首页 > 高级语言 > C#在线教程 > 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();
         // Call print to print integer
         p.print(5);
         // Call print to print float
         p.print(500.263);
         // Call print to print string
         p.print("Hello C++");
         Console.ReadKey();
      }
   }
}

让我们编译和运行上面的程序,这将产生以下结果:

Printing int: 5
Printing float: 500.263
Printing string: Hello C++

动态多态性

C#允许创建用于提供部分类实现接口的抽象类。当一个派生类从它继承实施完成。抽象类包含抽象方法,这是由派生类中实现。派生类有更多的专门功能。

请注意,关于抽象类以下规则:

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

  • 一个抽象类之外,不能声明抽象方法

  • 当一个类被声明密封的,它不能被继承,抽象类不能声明密封。

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

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 class area :");
         return (width * length); 
      }
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle(10, 7);
         double a = r.area();
         Console.WriteLine("Area: {0}",a);
         Console.ReadKey();
      }
   }
}

让我们编译和运行上面的程序,这将产生以下结果:

Rectangle class area :
Area: 70

当要在继承的类(ES)实现了一个类中定义一个函数,使用虚函数。虚函数可以在不同的继承类不同的方式实现,并调用这些函数在运行时决定。

动态多态是由抽象类和虚函数实现的。

下面的程序说明了这一点:

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("Parent class area :");
         return 0;
      }
   }
   class Rectangle: Shape
   {
      public Rectangle( int a=0, int b=0): base(a, b)
      {

      }
      public override int area ()
      {
         Console.WriteLine("Rectangle class area :");
         return (width * height); 
      }
   }
   class Triangle: Shape
   {
      public Triangle(int a = 0, int b = 0): base(a, b)
      {
      
      }
      public override int area()
      {
         Console.WriteLine("Triangle class area :");
         return (width * height / 2); 
      }
   }
   class Caller
   {
      public void CallArea(Shape sh)
      {
         int a;
         a = sh.area();
         Console.WriteLine("Area: {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 class area:
Area: 70
Triangle class area:
Area: 25