什么是多态性
在C#编程中,多态性就是指根据对象所属的不同的类型,在运行时选择不同的方法来处理该对象。具有多态性的语言可以让程序从不同的角度来使用同一个类的实例,增加程序的灵活性和可扩展性。
在C#中,多态性的实现通常有两种方式,继承和接口实现。继承通过从父类派生出子类的方式来实现多态性,而接口实现则是通过实现不同的接口来让程序在运行时选择不同的方法。
继承实现多态性
在C#中,通过继承来实现多态性非常常见。当一个类从另一个类继承时,它会继承其父类的所有成员,包括方法、属性、字段等。子类可以访问父类的公共和受保护的成员,但不能访问父类的私有成员。
子类可以重写父类中的方法,以在子类中实现不同的行为。当父类和子类都定义了同名的方法时,根据对象的实际类型,在运行时会选择不同的方法来执行。这就是继承实现多态性的基本原理。
下面是一个示例代码,展示了继承实现多态性的基本用法:
public class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("The animal makes a sound.");
}
}
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("The dog barks.");
}
}
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("The cat meows.");
}
}
public class Program
{
static void Main(string[] args)
{
Animal animal1 = new Animal();
Animal animal2 = new Dog();
Animal animal3 = new Cat();
animal1.MakeSound();
animal2.MakeSound();
animal3.MakeSound();
}
}
在上面的代码中,Animal是一个基类,它定义了一个虚拟的MakeSound方法。这个方法中只输出一条简单的语句,但它可以被派生类重写。
Dog和Cat是Animal的两个派生类,它们重写了MakeSound方法。Dog的MakeSound方法输出“The dog barks”,而Cat的MakeSound方法输出“The cat meows”。
在Main方法中创建了三个Animal类型的对象,分别是一个Animal、一个Dog和一个Cat。然后调用它们的MakeSound方法,因为这三个对象的实际类型分别是Animal、Dog和Cat,所以它们调用的方法也不同。输出结果为:
“The animal makes a sound.”
“The dog barks.”
“The cat meows.”
接口实现多态性
在C#中,接口是一种非常重要的语言特性。接口可以看作是一个成员列表,其中包含了一些成员的定义,但并不包含任何实现细节。类可以实现一个或多个接口,以表明它包含了接口中定义的所有成员。
接口实现多态性的基本原理和继承实现多态性类似。当一个类实现一个接口时,它必须提供接口中定义的所有成员的具体实现。然后可以将该类的对象存储到接口类型的变量中,在运行时可以根据实际类型选择方法的具体实现。
下面是一个示例代码,展示了接口实现多态性的基本用法:
public interface IShape
{
double CalculateArea();
}
public class Circle : IShape
{
private double radius;
public Circle(double radius)
{
this.radius = radius;
}
public double CalculateArea()
{
return Math.PI * this.radius * this.radius;
}
}
public class Rectangle : IShape
{
private double length;
private double width;
public Rectangle(double length, double width)
{
this.length = length;
this.width = width;
}
public double CalculateArea()
{
return this.length * this.width;
}
}
public class Program
{
static void Main(string[] args)
{
IShape shape1 = new Circle(2.0);
IShape shape2 = new Rectangle(2.0, 3.0);
Console.WriteLine("The area of shape1 is: " + shape1.CalculateArea());
Console.WriteLine("The area of shape2 is: " + shape2.CalculateArea());
}
}
在上面的代码中,IShape是一个接口,它定义了一个名为CalculateArea的方法。该方法没有任何实现细节,它只是提供了一个方法签名。
Circle和Rectangle是IShape的两个实现类,它们分别实现了CalculateArea方法。Circle类的CalculateArea方法计算圆的面积,而Rectangle类的CalculateArea方法计算矩形的面积。
在Main方法中创建了两个IShape类型的对象,分别是一个Circle和一个Rectangle。然后调用它们的CalculateArea方法,在运行时会根据对象的实际类型选择方法的具体实现。输出结果为:
“The area of shape1 is: 12.566370614359172”
“The area of shape2 is: 6”