【C#】多态

前言

        上篇博客说了面向对象三大特性中的前两个,对于最不容易理解的第三大特性——多态,在这篇博客中就会有简单的描述。很多人都不明白面向对象中多态的真正作用是什么,通过下面几个简单的小例子,让我们来感受下多态的威力。

定义

        多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
        简单来说,就是子类继承父类,以父类的身份出现,在工作时以自己的方式来实现,但是,子类以父类身份出现时,子类特有的属性和方法不可以使用。

用法

相关概念

虚方法

        为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的,通过在该成员的返回类型之前添加virtual关键字来实现。

方法覆写

        子类可以选择使用override关键字将父类实现替换为它自己的实现。

实例

       接着上篇博客的例子,由于Cat和Dog都有Shout的方法,只是叫的声音不同,所以我们可以让Animal有一个Shout的虚方法,然后让Cat和Dog去重写这个Shout,在使用的时候,就可以用Cat或者Dog来代替Animal叫,达到多态的目的。
class Animal
{
    public virtual string Shout()
    {
        return "";
    }
}//修饰符中增加了一个虚方法<virtual>,表示此方法可以被子类重写。
        接下来,我们让猫咪叫。
class Cat:Animal
{
    public Cat():base()
    {}
    public Cat(string name):base(name)
    {}
    public override string Shout()
    {
        string result = "";
        for (int i = 0;i < shoutNum;i++)
            result +="喵,";
        return "我的名字叫" + name + "" + result;
    }
}

        让狗狗叫。
class Dog:Animal
{
    public Dog():base()
    {}
    public Dog(string name):base(name)
    {}
    public override string Shout()
    {
        string result = "";
        for (int i = 0;i < shoutNum;i++)
            result +="汪,";
        return "我的名字叫" + name + "" + result;
    }
}
        我们发现,实现两个动物叫的代码仅仅有一点不同,它们继承了同一个类,表现出了不同的形式。接下来看客户端代码。
private Animal[] arrayanimal;//声明一个动物数组
private void button1_Click(object sender, EventArgs e)
{
    arrayAnimal = new Animal[5];//实例化最多可报名5个的动物数组对象
    arrayAnimal[0] = new Cat ("小花");
    arrayAnimal[1] = new Dog ("阿毛");
    arrayAnimal[2] = new Dog ("小黑");
    arrayAnimal[3] = new Cat ("娇娇");
    arrayAnimal[4] = new Cat ("咪咪");
}
//叫声比赛
private void button2_Click(object sender, EventArgs e)
{
    foreach (Animal item in arrayAnimal)
    {
        MessageBox.Show(item.Shout());
    }
}
        结果就是,点击叫声比赛后,弹出五个消息框,是猫叫就喵,狗叫就汪。

总结

        在这里,Animal作为一个父类,Cat和Dog类就是Animal的子类,子类代替父类进行Shout,但是Cat叫出来的是“喵”,Dog叫出来的是“汪”,这就是所谓的不同的对象可以执行相同的动作,但要通过它们自己的实现代码才行。要注意的是,对象的声明必须是父类,实例化的对象是子类,这样才能实现多态。
        多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用,即,虚方法是按照其运行时的类型而非编译时类型进行动态绑定调用的。


C# 中,**多态(Polymorphism)** 是面向对象编程的核心特性之一,它允许不同的类以统一的方式处理相同的消息或方法调用,从而实现灵活、可扩展的代码结构。多态的核心在于“一个接口,多种实现”。 ### 多态的基本概念 多态是指一个对象在不同情境下表现出不同的行为。具体来说: - 多态允许子类对父类的方法进行重写(Override),从而提供不同的实现方式。 - 程序在运行时会根据对象的实际类型来决定调用哪个方法,而不是根据变量的声明类型。 - 多态性提高了代码的可维护性和可扩展性,因为可以通过基类的引用调用派生类的方法,而无需修改现有代码。 ### 多态的实现方式 C#多态的实现主要有以下几种形式: 1. **虚方法(Virtual Methods)** - 在基类中使用 `virtual` 关键字声明方法。 - 派生类使用 `override` 关键字重写该方法。 - 在运行时,根据对象的实际类型决定调用哪个方法。 2. **抽象类与抽象方法(Abstract Classes and Methods)** - 抽象类不能被实例化,只能作为基类。 - 抽象方法没有实现,必须在派生类中重写。 - 抽象类和抽象方法是实现多态的一种强制手段。 3. **接口(Interfaces)** - 接口定义了一组方法和属性的契约。 - 多个类可以实现同一个接口,并提供自己的具体实现。 - 接口支持多重继承,适合实现跨类别的多态行为。 ### 示例:使用虚方法实现多态 以下是一个典型的多态示例,通过虚方法实现: ```csharp using System; namespace PolymorphismExample { class Program { static void Main(string[] args) { Person st = new Student("李雷"); Person th = new Teacher("井边君"); Person[] people = { st, th }; foreach (var person in people) { person.SayHello(); // 根据实际对象类型调用相应的方法 } Console.ReadKey(); } } class Person { public Person(string name) { this.Name = name; } public string Name { get; set; } public virtual void SayHello() { Console.WriteLine("我是父类的方法"); } } class Student : Person { public Student(string name) : base(name) { } public override void SayHello() { Console.WriteLine("我叫{0}, 我是学生", this.Name); } } class Teacher : Person { public Teacher(string name) : base(name) { } public override void SayHello() { Console.WriteLine("我叫{0}, 我是老师", this.Name); } } } ``` ### 示例:使用抽象类实现多态 ```csharp using System; abstract class Animal { public abstract void MakeSound(); } class Cat : Animal { public override void MakeSound() { Console.WriteLine("猫叫:喵喵喵"); } } class Dog : Animal { public override void MakeSound() { Console.WriteLine("狗叫:汪汪汪"); } } class Program { static void Main() { Animal myCat = new Cat(); Animal myDog = new Dog(); myCat.MakeSound(); // 输出:猫叫:喵喵喵 myDog.MakeSound(); // 输出:狗叫:汪汪汪 } } ``` ### 示例:使用接口实现多态 ```csharp using System; interface IAnimal { void MakeSound(); } class Cat : IAnimal { public void MakeSound() { Console.WriteLine("猫叫:喵喵喵"); } } class Dog : IAnimal { public void MakeSound() { Console.WriteLine("狗叫:汪汪汪"); } } class Program { static void Main() { IAnimal myCat = new Cat(); IAnimal myDog = new Dog(); myCat.MakeSound(); // 输出:猫叫:喵喵喵 myDog.MakeSound(); // 输出:狗叫:汪汪汪 } } ``` ### 多态的应用场景 1. **统一接口处理不同对象** - 多态允许使用统一的接口处理不同类型的对象,简化代码逻辑。 2. **提高代码的可扩展性** - 新增功能时无需修改已有代码,只需扩展新的子类。 3. **支持运行时动态绑定** - 在运行时根据对象的实际类型调用相应的方法,提升程序的灵活性。 ### 总结 多态C# 面向对象编程的重要特性,通过虚方法、抽象类和接口,可以实现灵活的代码结构和良好的扩展性。上述示例展示了如何通过不同方式实现多态,并展示了其在实际开发中的应用价值[^2]。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值