区别多态、重载、覆盖与重写

多态

按照对多态“同样的操作,得到不同的结果”的观点,重载(overload)和覆盖(override)都是实现多态的手段。其中,重载是静态多态实现,在程序编译时实现;覆盖是动态多态实现,在程序运行时实现。

 

重载

重载(Overload),指的是在同一个类中,同名但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字。

发生条件

① 在同一个类中。

② 方法名相同。

③ 方法参数类型或者个数不同。

代码示例

public class Name
 {
        public static string GetName(string username)
        {
            return username;
        }
        public static int GetName(int usercount)
        {
            return usercount;
        }
}

 

覆盖

覆盖(New)指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。

发生条件

① 必须存在继承关系。

② 方法名与父类的方法名一致的非虚函数。

③ 编译后会提示要求使用New关键字。

代码示例

    public class Animal
    {
        public void Eat()
        {
            Console.WriteLine("动物吃东西");
        }
    }

    public class Cat : Animal
    {
        public new void Eat()
        {
            Console.WriteLine("猫要吃鱼");
        }
    }

    public class NorthCat : Cat
    {
        public new void Eat()
        {
            Console.WriteLine("东北猫爱吃日本鱼");
        }
    }

 

重写

重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或override标注的,不能重写非虚方法或静态方法。

发生条件

① 必须存在继承关系。

② 方法名和参数列表必须与父类的方法保持一致。

③ 父类用Vritual修饰方法。

④ 子类用Override重写父类的方法。

代码示例

public class Animal
{
    public virtual void Eat()
    {
        Console.WriteLine("动物吃东西");
    }
}

public class Cat : Animal
{
    public int a = 2;
    public override void Eat()
    {
        Console.WriteLine("猫要吃鱼");
    }
}

public class NorthCat : Cat
{
    public override void Eat()
    {
        Console.WriteLine("东北猫爱吃日本鱼");
    }
}


 

小结

重写(Override)的两个函数的函数特征相同,应用在子类和父类中,会重写父类函数;

重载(Overload)的两个函数的函数名虽然相同,但函数特征不同,应用在同一类中;

覆盖(new)两个函数的函数名一定相同,但函数特征可相同也可不相同,应用在子类和父类中,会隐藏父类同名函数。

 

参考资料:

1、https://www.jb51.net/article/149512.htm

2、https://blog.csdn.net/cloudkings/article/details/79478319

—— 完 ——
相关推荐
评论

立 为 非 似

中 谁 昨 此

宵 风 夜 星

。 露 , 辰

文章点击榜

细 无 轻 自

如 边 似 在

愁 丝 梦 飞

。 雨 , 花