深入理解C#多态的完整攻略
什么是多态?
在面向对象编程(OOP)中,多态是指同一个方法在不同情况下表现出现不同的行为。简单来说,就是同样的操作在不同的对象上可以有不同的实现。多态的概念是OOP中的三大特性之一,其它两个是封装和继承。
C#中的多态
C#中的多态性是通过虚方法(Virtual Methods)、抽象类和接口实现的。关键字virtual
和override
用于C#中的虚方法重写,abstract
用于抽象方法,而interface
则代表接口。在实现多态时,需要使用到这些关键字。
虚方法和重写
虚方法是可以被重写的,而其它方法都不能被重写。使用关键字virtual
修饰一个方法可以将其置为虚方法,如下所示:
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("Animal eating...");
}
}
上面的代码中,Eat
方法被定义为虚方法。它可以被派生类(即继承Animal
类的子类)重写。
在派生类中重写虚方法时,需要在方法前使用override
关键字,从而告诉编译器这个方法是要重写基类中的虚方法,如下所示:
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("Cat eating fish...");
}
}
上面的代码中,Cat
类是Animal
类的派生类,它重写了Eat
方法。
抽象类和抽象方法
抽象类和抽象方法的作用与虚方法类似,它们也可以用于实现多态性。抽象方法是一种没有实现体的方法,而只是定义了方法名、返回值类型和参数。必须声明为abstract
,如下所示:
public abstract class Animal
{
public abstract void Eat();
}
上面的代码中,Animal
类中的Eat
方法没有实现体。这意味着该类不能被实例化,只能作为基类使用。从抽象类派生出的类必须实现其基类抽象方法。
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("Cat eating fish...");
}
}
在上面的代码中,Cat
类实现了Animal
类中的Eat
抽象方法。
接口
接口也可以用于实现多态性。C#中的接口是一种特殊的类,它只定义了类成员的名称、返回类型和参数,而没有任何实现。如下所示:
public interface IAnimal
{
void Eat();
}
上面的代码中,IAnimal
接口定义了一个Eat
方法。
实现接口的类必须实现接口中定义的所有成员。例如,下面的代码实现了IAnimal
接口:
public class Cat : IAnimal
{
public void Eat()
{
Console.WriteLine("Cat eating fish...");
}
}
示例说明
示例一
我们可以通过下面的代码来看一看多态性的具体表现:
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("Animal eating...");
}
}
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("Cat eating fish...");
}
}
public class Program
{
static void Main(string[] args)
{
Animal animal1 = new Animal();
Animal animal2 = new Cat();
animal1.Eat(); // 输出 "Animal eating..."
animal2.Eat(); // 输出 "Cat eating fish..."
}
}
上面的代码中,我们定义了Animal
类和Cat
类,其中Animal
类中的Eat
方法为虚方法。Cat
类重写了Eat
方法。在Main
方法中,我们定义了一个Animal
类型的实例和一个Cat
类型的实例。使用这两个实例调用Eat
方法,可以看到Animal
类型实例调用基类中的Eat
方法,而Cat
类型实例调用派生类中的Eat
方法。这就体现了多态的特性。
示例二
下面的代码演示了如何使用接口来实现多态性:
public interface IAnimal
{
void Eat();
}
public class Cat : IAnimal
{
public void Eat()
{
Console.WriteLine("Cat eating fish...");
}
}
public class Dog : IAnimal
{
public void Eat()
{
Console.WriteLine("Dog eating meat...");
}
}
public class Program
{
static void Main(string[] args)
{
IAnimal animal1 = new Cat();
IAnimal animal2 = new Dog();
animal1.Eat(); // 输出 "Cat eating fish..."
animal2.Eat(); // 输出 "Dog eating meat..."
}
}
上面的代码中,我们定义了IAnimal
接口和Cat
类、Dog
类分别实现了IAnimal
接口。在Main
方法中,我们定义了一个Cat
类型的实例和一个Dog
类型的实例,并将它们赋值给IAnimal
类型的引用。使用这两个实例调用Eat
方法,同样可以看到多态的特性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解c#多态 - Python技术站