1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写

总结:

1. 在继承上, new/override没区别

2. 在多态上,new不支持多态,override支持

在C#中改变类中相同名称的方法的实现过程中有三种方式:重载、重写和覆盖。

重载指具有相同的方法名,通过改变参数的个数或者参数类型实现同名方法的不同实现。

重写:则是只在继承中,子类通过override关键字修饰方法,实现父类和子类相同方法的不同实现,注意,父类方法必须是用virtual或者abstract关键字修饰的虚方法或者抽象方法

覆盖:则是指在继承中,子类通过在与父类相同方法名之前用new修饰的一个新的方法的定义

1.new ---- 子类隐藏父类的方法,覆盖(总结:new关键字不支持多态

下面的例子我们可以发现new 关键字,并不支持多态的应用

我们使用多态调用的任然还是父类中的方法,也就是被隐藏的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Father fa = new Son();
            fa.print();
        }
    }

    class Father
    {
        public  void print()
        {
            Console.WriteLine("我是父类");
        }
    }

    class Son : Father
    {
        public new void print()
        {
            Console.WriteLine("我是子类");
        }
    }
}

 输出:

如果我们使用了多态创建了实例,要调用子类重写的方法,需要强制转换成子类类型,实例如下:

class Program
    {
        static void Main(string[] args)
        {
            Father fa = new Son();
            Son so = (Son)fa;
            so.print();
        }
    }

输出:

 

2.virtual-- 重写 abstract--实现 (总结:这两种都支持多态)

a.重写父类的方法要用到override关键字(具有override关键字修饰的方法是对父类中同名方法的新实现)
b.要重写父类的方法,前提是父类中该要被重写的方法必须声明为virtual或者是abstract类型。(virtual修饰的可以有方法体,子类不一定要重写 abstract没有方法体,子类必须要实现)
C.virtual关键字用于将方法定义为支持多态,有virtual关键字修饰的方法称为“虚拟方法”

实例如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Father fa = new Son();
            fa.print();
        }
    }

    class Father
    {
        public virtual void print()
        {
            Console.WriteLine("我是父类");
        }
        
    }

    class Son : Father
    {
        public override void print()
        {
            Console.WriteLine("我是子类");
        }
    }
}
输出:

原文地址:https://www.cnblogs.com/zjdbk/p/9274341.html