C#基础知识整理:基础知识(7) 方法的隐藏
发布日期:2021-11-07 06:40:46 浏览次数:9 分类:技术文章

本文共 4371 字,大约阅读时间需要 14 分钟。

继承和抽象类中提到过,子类与父类的方法间有这些关系:

子类直接使用父类方法(但是必须父类方法是public或protected类型);
子类的方法覆盖父类方法(override);
子类的方法重载父类方法(overload);
看下面这种情况:

public class YSchool    {        private int id = 0;        private string name = string.Empty;        public int ID        {            get            {                return this.id;            }        }        public string Name        {            get            {                return name;            }        }        public YSchool()        {            this.id = 0;            this.name = @"清华大学附中";        }        public  YSchool(int id, string name)        {            this.id = id;            this.name = name;        }        ///         /// 构造器        ///         public  YSchool(int id)        {            this.id = id;            this.name = @"陕师大附中";        }    }    public class YTeacher    {        private int id = 0;        private string name = string.Empty;        private YSchool school = null;        private string introDuction = string.Empty;        private string imagePath = string.Empty;        public int ID        {            get            {                return id;            }        }        public string Name        {            get            {                return name;            }        }        public YSchool School        {            get            {                if (school == null)                {                    school = new YSchool();                }                return school;            }            set            {                school = value;            }        }        public string IntroDuction        {            get            {                return introDuction;            }            set            {                introDuction = value;            }        }        public string ImagePath        {            get            {                return imagePath;            }            set            {                imagePath = value;            }        }        ///         /// 构造器        ///         public YTeacher(int id, string name)        {            this.id = id;            this.name = name;        }        ///         /// 构造器        ///         public YTeacher(int id, string name, YSchool school)        {            this.id = id;            this.name = name;            this.school = school;        }        ///         /// 给学生讲课的方法        ///         public void ToTeachStudents()        {            Console.WriteLine(string.Format(@"{0} 老师教育同学们: Good Good Study,Day Day Up!", this.Name));        }        ///         /// 惩罚犯错误学生的方法        /// 加virtual关键字,表示该方法可以被覆盖重写        ///         ///         public virtual void PunishmentStudents(string punishmentContent)        {            Console.WriteLine(string.Format(@"{0} 的{1} 老师让犯错误的学生 {2}。", this.School.Name, this.name, punishmentContent));        }    }    public class UniversityTeacher : YTeacher    {        public UniversityTeacher(int id, string name,YSchool school)            : base(id, name, school)        {        }        ///         /// 隐藏父类的同名方法,隐藏后该类只能访问隐藏后的方法,不能访问到父类的该方法了。        ///         public new void ToTeachStudents()        {            Console.WriteLine(string.Format(@"{0} 老师教育同学们:认真学习.net!", this.Name));        }                ///         /// 覆盖        ///         public override void PunishmentStudents(string punishmentContent)        {            base.PunishmentStudents(punishmentContent);//也可以不执行父类方法。            //自己的代码        }    }
using System;namespace YYS.CSharpStudy.MainConsole{    class Program    {        static void Main(string[] args)        {            UniversityTeacher uTeacher = new UniversityTeacher(3, @"董边成", new YSchool(3, @"清华大学"));            //访问的是子类方法            uTeacher.ToTeachStudents();            //可以访问覆盖后的方法            uTeacher.PunishmentStudents(@"让你挂科。");            YTeacher teacher = new UniversityTeacher(3, @"董边成", new YSchool(3, @"清华大学"));            //访问不到隐藏的那个方法了            teacher.ToTeachStudents();            //可以访问覆盖后的方法            teacher.PunishmentStudents(@"跑10000米。");            Console.ReadKey();        }    }}

结果:

    子类继承父类的方法,使用new修饰一个同父类方法同名,参数列表相同的新方法的过程就叫做隐藏。也就是子类隐藏了父类的这个方法。不过隐藏与覆盖不同,隐藏的方法只能通过该方法所在的类访问,如果使用父类的变量,依然访问的是被隐藏的方法。

    从上面的代码中可以看到,覆盖和隐藏的区别。父类变量引用子类实例后,只能访问被隐藏的方法,而无法访问隐藏后的方法。但是都可以访问到覆盖后的方法。
还有一点就是如果想让这个方法被子类覆盖,那么父类该方法必须加上virtual。隐藏父类的方法new关键字也可以不加。隐藏一般使用的比较少,在一些特殊的情况下解决一些问题。

代码下载:

转载地址:https://blog.csdn.net/yysyangyangyangshan/article/details/7700165 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C#基础知识整理:基础知识(8) 接口
下一篇:C#基础知识整理:基础知识(6) 抽象类和抽象方法

发表评论

最新留言

不错!
[***.144.177.141]2024年03月03日 13时53分43秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

oracle里面如何查询sqlid,CSS_oracle中如何查看sql, --查询表状态:  select uo.O - phpStudy... 2019-04-21
php局部页面滚动,在访问另一页面后保留浏览器滚动位置 - php 2019-04-21
jmeter运行linux命令行,Jmeter在linux上运行(命令行运行Jmeter) 2019-04-21
linux服务器怎么添加站点,如何增加站点或虚拟主机及文件说明 2019-04-21
linux系统输入指令,Linux系统基础 - 基本操作命令 2019-04-21
mysql in 有序_mysql中的in排序 mysql按in中顺序来排序 2019-04-21
由于连接方在一段时间后没有正确答复或连接的主机_新风换气机使用效果不佳,为何?掌握正确使用方法就好了... 2019-04-21
mysql 查询姓王_MySQL查询语句练习题,测试足够用了 2019-04-21
mysql多实例脚本_mysql多实例脚本 2019-04-21
python如何生成excel文件夹_用python脚本通过excel生成文件夹树结构 2019-04-21
python获取post请求中的所有参数_Django从POST reques获取请求参数 2019-04-21
mysql加密复制_MySQL主从复制使用SSL加密 2019-04-21
python启动远端 exe_python打包exe开机自动启动的实例(windows) 2019-04-21
java当前路径_java获取当前路径的几种方法 2019-04-21
java web传递参数_Javaweb的八种传值方式 2019-04-21
java gui支持的包有哪两个_Java GUI 2019-04-21
java list详解_java集合List解析 2019-04-21
java坐标代码_java实现计算地理坐标之间的距离 2019-04-21
kettle调用java程序_Kettle ETL调用 java代码来进行数据库的增删改查 2019-04-21
mysql 取两个时间差 php_在php和MySql中计算时间差的方法详解 2019-04-21