我们先从几个问题入手
- 什么是多态?
- 多态的作用是什么?
- 如何实现多态?
多态性
多态意味着多重形式,往往表现为一个接口,多个功能。
静态多态性
C#提供两种技术来实现静态多态性
- 函数重载
- 运算符重载
函数的重载
你可以再同一个范围内对相同的函数名进行多个定义;
规则:函数的定义彼此不同,可以使参数的个数不同,也可以是参数的类型不同,或则两者都不同。不能只是返回值不同。
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++
动态多态性
在谈动态多态性之前我们先了解一下抽象类和虚函数;
抽象类 abstract
抽象类的一些规则:
- 不能创建一个抽象类实例(你必须继承以后才能使用)。
- 不能再抽象类外部申明一个抽象方法。
- 抽象类不能声明为sealed。(通过在类定义前面放置关键字sealed,可以将类声明为密封类。当一个类被声明为密封类是,它不能被继承。)
虚方法 virtual
虚方法使用关键字virtual来声明,虚方法可以再不同的类里面有不同的实现,通过override来实现。
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
总结
无论是抽象类还是虚方法,他们实现的功能就是某个接口在不同情况下实现不同的功能。这也正是多态性的特点。