• C# 函数覆盖总结学习


    覆盖类成员:通过new关键字修饰虚函数表示覆盖该虚函数。
    一个虚函数被覆盖后,任何父类变量都不能访问该虚函数的具体实现。
    public virtual void IntroduceMyself(){...}//父类虚函数
    public new void IntroduceMyself(){...}//子类覆盖父类虚函数

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MethodOverrideByNew
    {
        public enum Genders { 
            Female=0,
            Male=1
        }
        public class Person {
            protected string _name;
            protected int _age;
            protected Genders _gender;
            /// <summary>
            /// 父类构造函数
            /// </summary>
            public Person() {
                this._name = "DefaultName";
                this._age = 23;
                this._gender = Genders.Male;
            }
            /// <summary>
            /// 定义虚函数IntroduceMyself()
            /// </summary>
            public virtual void IntroduceMyself() {
                System.Console.WriteLine("Person.IntroduceMyself()");
            }
            /// <summary>
            /// 定义虚函数PrintName()
            /// </summary>
            public virtual void PrintName() {
                System.Console.WriteLine("Person.PrintName()");
            }
        }
        public class ChinesePerson :Person{
            /// <summary>
            /// 子类构造函数,指明从父类无参构造函数调用起
            /// </summary>
            public ChinesePerson() :base(){
                this._name = "DefaultChineseName";
            }
            /// <summary>
            /// 覆盖父类方法IntroduceMyself,使用new关键字修饰虚函数
            /// </summary>
            public new void IntroduceMyself() {
                System.Console.WriteLine("ChinesePerson.IntroduceMyself()");
            }
            /// <summary>
            /// 重载父类方法PrintName,使用override关键字修饰虚函数
            /// </summary>
            public override void PrintName(){
                System.Console.WriteLine("ChinesePerson.PrintName()");            
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                //定义两个对象,一个父类对象,一个子类对象
                Person aPerson = new ChinesePerson();
                ChinesePerson cnPerson = new ChinesePerson();
                //调用覆盖的方法,父类对象不能调用子类覆盖过的方法,只能调用自身的虚函数方法
                aPerson.IntroduceMyself();      
                cnPerson.IntroduceMyself();
                //调用重载方法,父类对象和子类对象都可以调用子类重载过后的方法
                aPerson.PrintName();
                cnPerson.PrintName();

                System.Console.ReadLine();
            }
        }
    }

    结果:
    Person.IntroduceMyself()
    ChinesePerson.IntroduceMyself()
    ChinesePerson.PrintName()
    ChinesePerson.PrintName()
  • 相关阅读:
    【概率】Uva 10900
    【组合数的唯一分解定理】Uva1635
    【欧拉定理】计算(a^(b^c))%1000000007
    【小小的思路】坑死自己的数学水题
    【杨氏矩阵+勾长公式】POJ 2279 Mr. Young's Picture Permutations
    【dp入门题】【跟着14练dp吧...囧】
    【补】【FZU月赛】【20150515】【待续】
    【二分查找最优解】FZU 2056 最大正方形
    【二进制】FZU 2062 Suneast & Yayamao
    【阔别许久的博】【我要开始攻数学和几何啦】【高精度取模+同余模定理,*】POJ 2365 The Embarrassed Cryptographer
  • 原文地址:https://www.cnblogs.com/gc2013/p/3860113.html
Copyright © 2020-2023  润新知