`
zhangziyangup
  • 浏览: 1187363 次
文章分类
社区版块
存档分类
最新评论

C#基础知识整理:基础知识(7) 方法的隐藏

 
阅读更多

继承和抽象类中提到过,子类与父类的方法间有这些关系:
子类直接使用父类方法(但是必须父类方法是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;
        }

        /// <summary>
        /// 构造器
        /// </summary>
        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;
            }
        }
        /// <summary>
        /// 构造器
        /// </summary>
        public YTeacher(int id, string name)
        {
            this.id = id;

            this.name = name;
        }

        /// <summary>
        /// 构造器
        /// </summary>
        public YTeacher(int id, string name, YSchool school)
        {
            this.id = id;

            this.name = name;

            this.school = school;
        }

        /// <summary>
        /// 给学生讲课的方法
        /// </summary>
        public void ToTeachStudents()
        {
            Console.WriteLine(string.Format(@"{0} 老师教育同学们: Good Good Study,Day Day Up!", this.Name));
        }
        /// <summary>
        /// 惩罚犯错误学生的方法
        /// 加virtual关键字,表示该方法可以被覆盖重写
        /// </summary>
        /// <param name="punishmentContent"></param>
        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)
        {

        }

        /// <summary>
        /// 隐藏父类的同名方法,隐藏后该类只能访问隐藏后的方法,不能访问到父类的该方法了。
        /// </summary>
        public new void ToTeachStudents()
        {
            Console.WriteLine(string.Format(@"{0} 老师教育同学们:认真学习.net!", this.Name));
        }
        
        /// <summary>
        /// 覆盖
        /// </summary>
        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关键字也可以不加。隐藏一般使用的比较少,在一些特殊的情况下解决一些问题。

代码下载:http://download.csdn.net/detail/yysyangyangyangshan/4399465

分享到:
评论

相关推荐

    C#常用知识整理

    以上就是C#常用的知识点,掌握这些基础知识将有助于你构建和维护高质量的C#应用程序。在实际编程过程中,还需要不断学习和理解更高级的主题,如并发处理、单元测试、设计模式等,以提升专业技能。

    c#面试基础知识包 面试准备

    在面试中,对C#基础知识的掌握是评估候选人能力的重要环节。本资料包针对C#的基础知识进行了整理,涵盖了面试中常见的考点,以下是这些知识点的详细说明: 1. **C#语法基础** - 变量:包括数据类型(如int、float...

    C#学习知识库2.0版

    C#学习知识库2.0版是一个专门为学习C#设计的知识整理系统,旨在帮助初学者和有经验的开发者更好地理解和掌握C#的关键概念和特性。 1. **基础语法**: - 变量与数据类型:C#支持基本数据类型(如int, double, bool...

    C#编程基础知识总结(适合初学者)

    以上是根据给定文件摘要整理出的C#编程基础知识点,涵盖了数据类型转换、字符串操作、控件属性设置、窗体显示与隐藏、文件读取以及键盘事件处理等方面的知识点。这些内容对于初学者来说是非常重要的基础技能,掌握了...

    c#控件设计整理

    C#控件设计是开发Windows桌面应用程序的基础,它涉及到用户界面的设计和交互。在C#中,窗体(Form)是构建用户界面的基本组件,它提供了承载其他控件的平台。以下是一些C#控件及其常用设计的关键知识点: 1. **窗体...

    C#工作中常用的基础知识面试题(二)

    【C#基础知识面试题解析】 在C#编程中,掌握基础是至关重要的,尤其是在面试时。以下是一些常见的C#面试问题及解答: 66. 软件开发过程一般有几个阶段?每个阶段的作用? 软件开发通常包括五个主要阶段: 1. 需求...

    2018C#面试整理

    以上内容涵盖了C#面试中的关键知识点和技术细节,包括.NET框架的基础、内存管理、设计模式以及一些重要的面试理论题。这些知识对于准备C#面试非常重要,能够帮助开发者深入理解.NET和C#的技术细节,并在实际开发工作...

    c# 基础 问答形式 有详细答案

    以下是根据“C#基础概念二十五问”整理的关键知识点,旨在帮助读者深入理解C#的基本构造和原理。 #### 1. 静态成员和非静态成员的区别 静态成员(包括变量和方法)是类级别的,意味着它们在类被加载时即创建,并且...

    C#控件及常用设计整理.txt

    ### C#控件及其常用设计知识点详解 #### 一、窗体基础属性解析 在C#编程中,窗体是用户界面的基础组成部分,通过合理的设置窗体的各种属性,可以实现丰富的用户交互体验。以下是对部分关键窗体属性的详细介绍: 1...

    C# in depth要点整理(一张A4纸, 打印版)

    《C# in depth要点整理》是一份详细的C#编程指南,旨在帮助开发者深入理解这门强大的编程语言。本文档基于博主wjason在iteye博客上分享的内容,将关键知识点提炼成便于打印和学习的A4纸格式。以下是文档中涵盖的一些...

    C#入门基础课件非常经典

    这个“C#入门基础课件”包含了老师精心整理的教学材料,涵盖了以上所有内容,通过深入学习和实践,你将能够掌握C#编程的基础知识。在课余时间认真研读,结合实际编程练习,你将快速成长为一名合格的C#程序员。 总的...

    C#Primer的笔记整理

    理解这些基础知识对于编写任何C#程序都是至关重要的。 接着,`02 Class的设计.md`详细讲解了类的设计原理和实践。在C#中,类是面向对象编程的基础,它定义了一组属性(数据成员)和方法(行为),用于封装数据和...

    C#控件及常用设计整理

    在C#编程中,控件和设计是构建用户界面的核心元素。C#提供了丰富的控件集,使得开发者能够创建各种类型的交互式应用。本篇主要介绍C#中窗体(Form...了解和熟练掌握这些基础知识对于创建功能丰富的C#应用程序至关重要。

    C#资料,本人学习整理过

    根据提供的文档内容,我们可以归纳总结出以下C#的相关知识点: ### .Net Framework简介 .NET Framework 是一个由...通过这些知识点的学习,开发者可以更好地理解和掌握C#语言的基础知识以及面向对象编程的核心概念。

    整理历届的经典C#面试题

    本资料包“整理历届的经典C#面试题”是针对C#开发者准备面试时的重要参考资料,它包含了历年来的常见问题和难点,旨在帮助求职者提升对C#语言的深入理解,并能在面试中展现出扎实的技能基础。 以下是一些可能出现在...

    C#使用中常见问题整理

    在深入探讨C#使用中常见的25个问题之前,我们先来回顾一下C#的基础概念。C#是一种现代、面向对象、类型安全的编程语言,由微软开发,旨在提高程序员的生产力,同时确保代码的可读性和安全性。下面,我们将详细解析这...

    .NET知识点整理学习资料.pdf

    .NET 框架基础和 C# 语法基础知识点整理 .NET 框架基础: 1. CLR(通用语言运行库)是 .NET 框架的核心组件,包括两部分:通用语言运行库和符合 CLI 的类库。 2. CLI(通用语言基础结构)是语言和数据格式的规范,...

Global site tag (gtag.js) - Google Analytics