学习笔记:C#入门(六)继承&多态:方法重写override virtual&abstract虚方法和抽象方法

首先来一段代码,看一下继承的关系

    class Monster
    {
        public void BeHit()
        {
            Console.WriteLine("基类Behit");
        }

    }
    class Slam : Monster
    {
        public void BeHit()
        {
            Console.WriteLine("打史莱姆");
        }
    }
    class Mario : Monster
    {
        public void BeHit()
        {
            Console.WriteLine("打马里奥");
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            Monster mo = new Monster();
            Mario m = new Mario();
            Slam s = new Slam();

            mo.BeHit();
            m.BeHit();
            s.BeHit();
            Console.ReadKey();
        }
    }

创建了三个类,其中slam和mario继承了monster,三个类中有同名函数BeHit();
所以我们知道了第一点
1.子类的方法可以与父类的方法同名
main函数中分别创建了三个类的对象,执行了同名方法
运行结果,果然就是每个类的实例运行各自的方法

基类Behit
打马里奥
打史莱姆

尝试一下别的情况

    class Program
    {
        static void Main(string[] args)
        {

            Mario m = new Mario();
			m.BeHit();
			
            Monster monster = m;
            monster.BeHit();

            Mario n = (Mario)monster;
            n.BeHit();

            Console.ReadKey();
        }
    }

运行结果

打马里奥
基类Behit
打马里奥

首先声明了 Mario m = new Mario();
然后运行,输出肯定是 打马里奥 没有疑问。

然后声明了 Monster monster = m; 没有报错
知道了:
2.父类的变量,可以指向子类的对象
此时再monster.BeHit();执行的是父类的方法,输出 基类Behit
这里我尝试将Mario()中的方法改名为BeHit1();然后monster.BeHit1(),系统报错
在这里插入图片描述
那么虽然monster和m本质是同一个对象,但是monster只能在父类中寻找方法,而m是在子类中寻找方法。

3.某种情况下,强制类型转换可以将父类对象转化成子类对象
Mario n = (Mario)monster; 不会报错,因为monster原本就是Mario类型的m转化的,输出 打马里奥 没有疑问
Slam p = (Slam)monster;显示不报错,执行报错
在这里插入图片描述
Slam p = (Slam)m;显示红线报错
在这里插入图片描述

使用virtual和override关键字,进行方法的重写

    class Monster
    {       
        public virtual void BeHit()
        {
            Console.WriteLine("基类Behit");
        }

    }
    class Slam : Monster
    {
        public override void BeHit()
        {
            Console.WriteLine("打史莱姆");
        }
    }
    class Mario : Monster
    {
        public override void BeHit()
        {
            Console.WriteLine("打马里奥");
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            Monster m = new Mario();
            Monster n = new Slam();
            m.BeHit();
            n.BeHit();
            //p.BeHit();
            Console.ReadKey();
        }
    }

1.父类中要被重写的方法必须用virtual或者是abstract修饰。
2.子类中用override修饰方法重写父类方法
这次运行

        Monster m = new Mario();
        Monster n = new Slam();
        m.BeHit();
        n.BeHit();

输出为:

打马里奥
打史莱姆      

另外:
virtual修饰的方法叫虚方法,virtual修饰的可以有方法体,子类不一定要重写
abstract修饰的方法叫抽象方法,abstract修饰的没有方法体,子类必须要重写
抽象方法只能在抽象类中声明,虚方法不是;

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值