【c#视频】——面向对象——多态

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的结果。也就是说,同一个类型的实例调用“相同”的方法,产生的结果是不同的,这里的“相同”打上双引号是因为这里的相同的方法仅仅是看上去相同的方法,实际上它们调用的方法是不同的。

重载(overload)

在同一个作用域(一般指一个类)的两个或多个方法函数名相同,参数列表不同的方法叫做重载,它们有三个特点。

  1. 方法名必须相同
  2. 参数列表必须不相同
  3. 返回值类型可以不相同
public static int AddNumber(int num1,int num2)
{
    return num1+num2;
}
public static double AddNumber(double num1,double num2)
{
    return num1+num2;
}
public static double AddNumber(double num1,int num2)
{
    return num1+num2;
}

重写(override)

子类中为满足自己的需求来重复定义某个方法的不同实现,需要用override关键字。被重写的方法必须是虚方法,用的是virtual关键字,它的特点(三个相同)。

  1. 相同的方法名
  2. 相同的参数列表
  3. 相同的返回值

父类中的定义:

public virtual void EatFood()
{
    Console.WriteLine("Animal吃东西");
}

子类中的定义:

public override void EatFod()
{
    Console.WriteLine("Cat吃东西");
}

虚方法(virtual)

即为基类中定义的允许在派生类中重写的方法,使用virtual关键字定义。

public virtual void EatFood()
{
    Console.WriteLine("Animal吃东西");
}

注意:虚方法也可以被直接调用。如:

Animal a =new Animal();
a.EatFood();

抽象方法(abstract)

在基类中定义的并且必须在派生类中重写的方法,使用abstract关键字定义。抽象方法必须在抽象类中,抽象类无法实例化,父类是抽象类,子类继承了这个类,必须把抽象类中的抽象方法重写。

public abstract class Animal
{
    public abstract void Shout();
}
public class Pig:Animal
{
    public override void Shout()
    {
        Console.WriteLine("哼哼叫");
    }
}

隐藏方法(new)

在派生类中定义的和基类中的某个方法同名的方法,使用new关键字定义。
隐藏方法不但可以隐藏基类中的虚方法,而且也可以隐藏基类中的非虚方法。
隐藏方法中父类的实例调用父类的方法,子类的实例调用子类的方法。

public void Sleep()
{
    Console.WriteLine("Animal Sleep");
}

则在派生类Cat中定义隐藏方法的代码为:

new public void Sleep()
{
    Console.WriteLine("Cat Sleep");
}

或者为:

public new void Sleep()
{
    Console.WriteLine("Cat Sleep");
}

来一个总结性的代码:

class Program
{
    static void Main(string[] args)
    {
        //Animal的实例
        Animal a =new Animal();

        //Animal的实例,引用派生类Cat对象
        Animal ac =new Cat();
        //Animal的实例,引用派生类Dog对象
        Animal ad =new Dog();

        //Cat的实例
        Cat c=new Cat();
        //Dog的实例
        Dog d=new Dog();

        //重载
        a.Sleep();
        a.Sleep(23);
        //重写和虚方法
        a.EatFood();
        ac.EatFood();
        ad.EatFood();
        //抽象方法
        a.Live();
        //隐藏方法
        a.Sleep();
        ac.Sleep();
        c.Sleep();
        Console.ReadKey();
    }
}

小编还在努力加载中……T_T
这里写图片描述

猜你喜欢

转载自blog.csdn.net/mirabellezwh/article/details/80592913