面向对象(四):多态

目录

一、多态的概念

 二、多态的使用

1.new 关键字隐藏

2.方法重写

三、密封类

1.密封类简介

 2.密封方法


一、多态的概念

       多态的意思即为多种形态,现实生活中存在很多种多态的情况,例如,人们都有工作,但每个人的工作内容不一样。医生的工作是看病,清洁工的工作是打扫卫生等。如图

 二、多态的使用

在面向对象思想中,多态的主要表现形式是:子类继承父类后对于同一个方法有不同的实现方式。多态的实现方式有两种:隐藏父类方法和重新父类方法。

1.new 关键字隐藏

在C#中,使用new关键字来达到隐藏父类成员的目的。代码如下

定义人类,包含工作方法:

class Person
    {
        public void Work()//定义工作方法
        {
            Console.WriteLine("人在工作");
        }
    }

定义医生类,清洁工类继承于人类:

class Doctor:Person
    {
        public new void Work()
        {
            Console.WriteLine("医生的工作是看病");
        }
    }
class Clearner:Person
    {
        public new void Work()
        {
            Console.WriteLine("清洁工的工作是扫地");
        }
    }

创建医生类,清洁工类对象,并调用方法:

static void Main(string[] args)
        {
            Person p = new Person();
            Doctor d = new Doctor();
            Clearner c = new Clearner();
            p.Work();
            d.Work();
            c.Work();

        }     

运行结果位:

从图中可以看出父类对象调用的是父类的Work()方法,子类对象调用的是子类对象的方法。

 当然,在子类中定义和父类同名的方法,不使用new关键字,子类中的方法也可隐藏父类中的同名方法,但编译器有可能报错。

2.方法重写

父类方法定义为虚方法(使用 Virtual 关键字)

 class Person
    {
        public virtual void Work()//定义工作方法
        {
            Console.WriteLine("人在工作");
        }
    }

子类重新方法(使用 Override 关键字)

 class Doctor:Person
    {
        public override void Work()
        {
            Console.WriteLine("医生的工作是看病");
        }
    }

创建子类,调用Work()方法:

 static void Main(string[] args)
        {
            Doctor d = new Doctor();
            d.Work();
        }  

输出为:

 重写方法时,子类和父类方法的返回值类型、方法名和参数必须完全相同,子类方法的可访问性不能低于父类方法。

三、密封类

1.密封类简介

密封类使用sealed修饰,不能用作父类。因此,密封类主要用于房租派生子类。

语法:

sealed class 类名{

}

 由于密封类不能被继承,使用类中的方法不能定义为虚方法。

 2.密封方法

使用sealed修饰的方法称为密封方法,密封方法是指不允许子类再次重新的方法。

例如,定义骑士类继承于战士类、虽然战士类的Attack()方法没有使用 virtual修饰定义为虚方法,但他重写了Role 类的方法,使用在骑士类中可以再次被重写。代码如下

class Role
    {
        public virtual void Attack()//定义为虚方法
        {
            Console.WriteLine("角色使用了普通攻击");
        }
    }
    class Warrior : Role//战士类继承Role
    {
        public override void Attack()
        {
            Console.WriteLine("战士使用了普通攻击");
        }
    }
    class Knight : Warrior//骑士类继承战士类
    {
        public override void Attack()
        {
            Console.WriteLine("骑士使用了普通攻击");
        }
    }

如果不允许骑士类再次重新Attack()方法,可以在战士类中的Attack()方法前加上 sealed关键字,效果如下。

 sealed修饰方法时只能于override一起使用,防止重写的方法再次被重写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值