C#学习篇2:重载和重写 虚方法和抽象方法

本篇问转载文章,仅供学习使用。。。

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

  • 方法名必须相同
  • 参数列表必须不相同
  • 返回值类型可以不相同

例如:

public void Sleep()
{
    Console.WriteLine("Animal睡觉");
}
public int Sleep(int time)
{
    Console.WriteLine("Animal{0}点睡觉", time);
    return time;
}

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

  • 相同的方法名
  • 相同的参数列表
  • 相同的返回值

如:父类中的定义:

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

子类中的定义:

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

小提示:经常有童鞋问重载和重写的区别,而且网络上把这两个的区别作为 C# 做常考的面试题之一。实际上这两个概念完全没有关系,仅仅都带有一个“重”字。他们没有在一起比较的意义,仅仅分辨它们不同的定义就好了。

虚方法和抽象方法的区别是:因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现。

虚方法的调用:调用上,使用子类构造的对象调用虚方法,就会调用子类的方法,使用父类构造的对象,就会调用父类的方法。

隐藏方法的调用:调用上, 使用子类类型的声明调用隐藏方法,就会调用到子类的方法。若想调用被隐藏的方法,需要用父类类型的声明来调用。

调用不同的举例:

class Enemy
{
    public void Move() {
        Console.WriteLine("调用了 enemy的move方法");
    }
    public virtual void Attack() {
        Console.WriteLine("enemy attac");
    }
    }


    class Boss : Enemy
    {
    public override void Attack() {
        Console.WriteLine("Boss Attac");
    }

    public new void Move() {
        Console.WriteLine("Boss move");
    }
}

static void Main(string[] args)
{
    //---- 隐藏方法的调用----begin
    Boss oneEnemy = new Boss();
    oneEnemy.Move(); // 调用的是隐藏方法, 用子类的声明来调用的,调用的就是子类的Move。

    Enemy twoEnemy = new Boss();
    twoEnemy.Move(); // 调用的隐藏方法, 用父类的声明来调用的,调用的就是父类的Move方法。
    //-----------------------end

    //-----虚方法的调用----- begin
    用什么类型 来构造,在调用方法的时候就会调用什么类型的方法。

    Enemy threeEnemy = new Enemy();
    threeEnemy.Attac(); // 调用虚方法,用父类来实例化的,所以调用的是父类的Attac方法。

    Enemy fourEnemy = new Boss();
    fourEnemy.Attac();  // 调用虚方法,用子类来实例化的,所以调用的就是子类(Boss)的Attac方法。

    //-----虚方法的调用------end

    Console.ReadKey();
}

 

你可能感兴趣的:(C#学习篇2:重载和重写 虚方法和抽象方法)