Jtro的技术分享:c#多态

作者: UnityPlane | 来源:发表于2019-03-25 15:35 被阅读51次

多态的作用就是把不同的子类都当作父类来看,通过继承实现不同的不同对象相同方法,表现出不同的行为,写出通用的代码,做出通用的编程,以适应需求的不断变化。

1. 虚方法实现多态

2.抽象方法实现多态

3.接口实现多态

虚方法实现的多态:
在c#中用virtual来定义虚方法,虚方法仅适用于有继承关系的类对象,所以只有类的成员函数才能说明为虚函数。虚方法必须有实现的部分,派生类可以去覆盖也可以不覆盖。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//鸟的父类、基类
public class Bird
{
    public virtual void Eat()
    {
        Debug.Log("吃");
    }
    public virtual void Sleep()
    {
        Debug.Log("睡");
    }
}
//麻雀 继承Bird
public class sparrow:Bird
{
    public override void Eat()
    {
        Debug.Log("麻雀吃稻谷");
       // base.Eat(); 不执行父类中的原有方法
    }
    public override void Sleep()
    {
        Debug.Log("麻雀睡在屋檐下");
       // base.Sleep();
    }

}
public class eagle : Bird
{
    public override void Eat()
    {
        Debug.Log("老鹰吃肉");
       // base.Eat();
    }
    public override void Sleep()
    {
        Debug.Log("老鹰睡山崖");
       // base.Sleep();
    }
}


public class DT : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Bird[] birds =
        {
            new Bird(),
            new eagle(),
            new sparrow ()
        };

        foreach (var item in birds)
        {
            item.Eat();
            item.Sleep();
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

运行结果如下:


Q.png

抽象方法
在c#中使用关键字abstract来定义抽象类和抽象方法,不能初始化的类教抽象类,它们只提供部分实现功能,但是另一个类可以继承他并且能创建他们的实例
抽象类能够被用于类、方法、属性、索引器和事件,使用abstract声明的抽象方法只能在抽象类中,抽象方法只有声明,没有实现代码,需要在派生类中实现。
修改Bird 基类,将其改成抽象类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//鸟的父类、基类
public abstract class Bird
{
    public abstract void Eat();

    public abstract void Sleep();
    
}
//麻雀 继承Bird
public class sparrow : Bird
{
    public override void Eat()
    {
        Debug.Log("麻雀吃稻谷");
        // base.Eat(); 不执行父类中的原有方法
    }
    public override void Sleep()
    {
        Debug.Log("麻雀睡在屋檐下");
        // base.Sleep();
    }

}
public class eagle : Bird
{
    public override void Eat()
    {
        Debug.Log("老鹰吃肉");
        // base.Eat();
    }
    public override void Sleep()
    {
        Debug.Log("老鹰睡山崖");
        // base.Sleep();
    }
}


public class NewBehaviourScript : MonoBehaviour
{
    void Start()
    {
        Bird[] birds =
        { 
            new eagle(),
            new sparrow ()
        };

        foreach (var item in birds)
        {
            item.Eat();
            item.Sleep();
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
抽象方法截图.png

由此可见,选择使用抽象方法还是使用虚方法来实现多态,就是要不要使用基类来实例化对象的区别。
接口方法 。待补充

相关文章

网友评论

    本文标题:Jtro的技术分享:c#多态

    本文链接:https://www.haomeiwen.com/subject/prtbvqtx.html