对C#多态的理解
什么是多态
多态是定义在父类中的函数被子类继承之后,可以具有不同的实现方式的一种能力。C#中的多态主要有两种实现方式:重载和重写。
重载
重载是通过定义同名的方法,但拥有不同的参数列表,实现多态的一种方式。C#中的重载函数必须拥有不同的参数个数或参数类型,否则编译器无法识别。
下面是一个求两个整数和的函数Add的重载示例:
public int Add(int a, int b)
{
return a + b;
}
public int Add(int a, int b, int c)
{
return a + b + c;
}
上述两个Add函数拥有相同的函数名,但参数列表不同,编译器可以根据参数列表来自动选择对应的函数。
重写
重写是通过在子类中重新实现父类的虚方法,从而实现多态的一种方式。子类重写父类的虚方法,可以根据自己的需要改变原有的实现方式,实现自定义的逻辑。
下面是一个求面积的图形Shape类和两个派生类Circle和Rect的重写示例:
public class Shape
{
public virtual double Area()
{
return 0;
}
}
public class Circle : Shape
{
private double radius;
public Circle(double r)
{
radius = r;
}
public override double Area()
{
return Math.PI * radius * radius;
}
}
public class Rect : Shape
{
private double width, height;
public Rect(double w, double h)
{
width = w;
height = h;
}
public override double Area()
{
return width * height;
}
}
上述Shape类定义了一个虚方法Area,返回0。Circle类和Rect类继承自Shape类,并重写了Area方法,实现了自己的求面积逻辑。
示例1
Shape[] shapes = new Shape[3];
shapes[0] = new Circle(2);
shapes[1] = new Rect(2, 3);
shapes[2] = new Circle(3);
double totalArea = 0;
foreach (Shape shape in shapes)
{
totalArea += shape.Area(); // 多态调用
}
Console.WriteLine("图形的总面积为:" + totalArea);
上述示例中,定义了一个Shape类型的数组,其中存放了圆和矩形两种图形。通过对Shape类Area方法的重写,可以根据图形的类型,自动调用对应的求面积方法。最终计算出图形的总面积。
示例2
public class File
{
public virtual void Open()
{
Console.WriteLine("打开文件");
}
}
public class TextFile : File
{
public override void Open()
{
Console.WriteLine("打开文本文件");
}
}
public class ImageFile : File
{
public override void Open()
{
Console.WriteLine("打开图像文件");
}
}
public class VideoFile : File
{
public override void Open()
{
Console.WriteLine("打开视频文件");
}
}
public class Program
{
static void Main()
{
File file = new File();
file.Open();
file = new TextFile();
file.Open();
file = new ImageFile();
file.Open();
file = new VideoFile();
file.Open();
}
}
上述示例中,定义了一个File类和三个派生类TextFile、ImageFile和VideoFile,分别用来打开不同类型的文件。在Program类中分别创建了一个File对象和三个派生类的对象,并分别调用了它们的Open方法。通过对File类Open方法的重写,可以根据文件类型,自动调用对应的打开方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:对C# 多态的理解 - Python技术站