• 基类方法的隐藏与调用——《C#入门经典》


    在某地方帮忙,闲来无事,打开《C#入门经典》继续看。哎,没网的情况下,很DT。

    不记得上次自己看到哪一页了。感觉基类方法的隐藏与调用原来扫过一次,但是完全不记得方法了,故在此写下,以作备用。

    ***********************************分割线*************************************

    1.隐藏基类方法:

    private class BaseClass
    {
         public void DoSomething()
         {
              Console.WriteLine("Base-->DoSomething");
         }
    }
    
    private class DerivedClass1 : BaseClass
    {
         public void DoSomething() 
         {
              Console.WriteLine("Derived-->DoSomething");
         }
    }
    private class DerivedClass2 : BaseClass
    {
    }

    运行结果:

    image

    小结:

    虽然结果可以达到要求,但是编译器会提示有个warning,提示隐藏了基类方法,询问是有意为之,并提示有意为之的话可以使用关键字new

    当使用new关键字修饰DoSomething之后,warning消失。

    同时,基类的方法,可以加virtual修饰,也可以不用,效果一样。

    private class DerivedClass1 : BaseClass
    {
        new public void DoSomething() 
        {
             Console.WriteLine("Derived-->DoSomething");
        }
    }

    ***********************************分割线*************************************

    2.重写基类方法

    这里需要注意,重写与隐藏是不一样的,重写会修改基类代码而隐藏不会。

    示例如下:

    复制代码
         static void Main(string[] args)
            {
                Console.Write("new的基类:           ");
                BaseClass newBaseClass = new BaseClass();
                newBaseClass.DoSomething();
                Console.Write("new的派生类:         ");
                DerivedClass derivedClass = new DerivedClass();
                derivedClass.DoSomething();
                Console.Write("从派生类创建的基类:  ");
                BaseClass derived2BaseClass = derivedClass;
                derived2BaseClass.DoSomething();
                Console.ReadLine();
            }
    
            private class BaseClass
            {
                public virtual void DoSomething()
                {
                    Console.WriteLine("Base-->DoSomething");
                }
            }
            private class DerivedClass : BaseClass
            {
                public override void DoSomething()
                {
                    Console.WriteLine("Derived-->DoSomething");
                }
            }
    复制代码

    结果如下:

    image

    小结:

    从运行结果可以看到,基类代码已经改变。所以第三次输出已经改变了输出。而上面使用同名进行隐藏的方法,即使也使用baseClass=derivedClass,输出结果仍然是基类的方法。

    ***********************************分割线*************************************

    3.调用基类方法

    可以使用base从而调用基类的方法,例如上面的代码中,如果在派生类的DoSomething后再加上base.DoSomething();就会再输出一个Base——>DoSomething

    在这里就不示例了,感觉没什么好示例的。。。

    ***********************************分割线*************************************

    P.S.书再向上翻一下,会看到下面的话:

    类中的自动属性{get;set;}必须同时存在,无法只出现一个,如果要只出现一个,得自己重写。

    好吧,发觉这个点我不清楚。。。所以在这再写下,提醒自己。

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    libxml2.7.8 c++ 解析xml文件
    Head First设计模式-模板方法模式
    嵌入式开发之工具移植--openssl移植
    嵌入式开发之工具移植--wpa_suppliant工具的移植和使用
    linux下嵌入式wifi开发工具移植
    IOS面试题(英文)
    机器学习学习笔记 PRML Chapter 2.0 : Prerequisite 1
    机器学习学习笔记 PRML Chapter 2.0 : Prerequisite 2 -Singular Value Decomposition (SVD)
    CCJ PRML Study Note
    CCJ PRML Study Note
  • 原文地址:https://www.cnblogs.com/jqmtony/p/2910387.html
Copyright © 2020-2023  润新知