C#中分别用基类和派生类引用以及分别用new屏蔽基类方法和override重写基类虚方法

先看代码

using System;
namespace Object
{
    public class Pet {
        public string name;
        public void PrintName() {
            Console.WriteLine("printName: pet name:" + name);
        }
        virtual public void Print()
        {
            Console.WriteLine("virtual print: 这是Pet:" + name);
        }
    }
    public class DOG : Pet
    {
        /**
         * 屏蔽父类同签名方法 (前面+new,否则报警告)
         */
        new public void PrintName() {
            Console.WriteLine("printName:这是DOG:" + name);
        }
        /**
         * 方法重写
         */
        public override void Print()
        {
            Console.WriteLine("print:派生类方法重写!这是DOG:" + name);
            //base.print();
        }
    }
    public class Cat : Pet
    {
        /**
         * 方法重写
         */
        public override void Print()
        {
            Console.WriteLine("print:派生类方法重写!这是cat:" + name);
            //base.print();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Pet dog = new DOG();
            dog.name = "jack";
            dog.PrintName();//虽然屏蔽了父类的方法,但是由于dog用的是父类的引用,此处调用父类的PrintName
            dog.Print(); //方法重写,调用新方法
            DOG ldog = new DOG();
            ldog.name = "little jack";
            ldog.PrintName();//屏蔽了父类的方法,此处调用自己的PrintName
            ldog.Print();//方法重写,调用新方法
            Pet cat = new Cat();
            cat.name = "jerry";
            cat.PrintName();//调用父类方法
            cat.Print();//方法重写,调用新方法
        }
    }
}

执行结果

 

由此可见

  1. 在派生类中,可以使用new关键字屏蔽(覆盖)基类的同签名的方法(注意,不加new不报错,只是警告)

  2. 如果使用基类的引用(子类的的对象使用了基类的引用)尝试调用使用new屏蔽的方法时,会调用基类方法,而不是调用子类中的新方法

  3. 基类中使用virtual定义的虚方法,可以在子类中重写,当然也可以不重写

  4. 如果使用基类的引用调用被子类重写的方法,依然会调用子类中重写的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值