zoukankan      html  css  js  c++  java
  • (原创)c#学习笔记10--定义类成员02--类成员的其他议题01--隐藏基类方法

    10.2  类成员的其他议题

      下面该讨论一些比较高级的成员议题了。本节主要研究:

        隐藏基类方法

        调用重写或隐藏的基类方法

        嵌套的类型定义

    10.2.1  隐藏基类方法

      当从基类继承一个(非抽象的)成员时,也就继承了其实现代码。如果继承的成虽是虚拟的,就可以用override关键字重写这段实现代码。无论继承的成员是否为虚拟,都可以隐藏这些实现代码。这是很有用的,例如,当继承的公共成员不像预期的那样工作时,就可以隐藏它。

      使用下面的代码就可以隐藏:

    public class MyBaseClass {
        public void DoSomething() {
            // Base implementation.
        }
    }
    
    public class MyDerivedClass : MyBaseClass {
        public void DoSomething() {
            // Derived class implementation, hides base implementation.
        }
    }

      尽管这段代码正常运行,但它会产生一个警告,说明隐藏了一个基类成员。如果是无意间隐藏了一个需要使用的成员,此时就可以改正错误。如果确实要隐藏该成员,就可以使用new关键字显式地表明意图

    public class MyBaseClass {
        public void DoSomething() {
            // Base implementation.
        }
    }
    
    public class MyDerivedClass : MyBaseClass {
        new public void DoSomething() {
            // Derived class implementation, hides base implementation.
        }
    }

      其工作方式是完全相同的,但不会显示警告。此时应注意隐藏基类成员和重写它们的区别。考虑下面的代码:

    public class MyBaseClass {
        public virtual void DoSomething() {
            Console.WriteLine( "Base imp" );
        }
    }
    
    public class MyDerivedClass : MyBaseClass {
        public override void DoSomething() {
            Console.WriteLine( "Derived imp" );
        }
    }

      其中重写方法将替换基类中的实现代码,这样,下面的代码就将使用新版本,即使这是通过基类类型进行的,情况也是这样(使用多态性):

    MyDerivedClass myObj = new MyDerivedClass();
    MyBaseClass myBaseObj;
    myBaseObj = myObj;
    myBaseObj.DoSomething();

      结果如下:

    Derived imp 

      另外,还可以使用下面的代码隐藏基类方法:

    public class MyBaseClass {
        public virtual void DoSomething() {  // 方法不必是虚拟的,但结果是一样的.
            Console.WriteLine( "Base imp" );
        }
    }
    
    public class MyDerivedClass : MyBaseClass {
        new override void DoSomething() {
            Console.WriteLine( "Derived imp" );
        }
    }

      其结果如下:

    Base imp     // 注意,这里跟使用重写结果不一样。

      尽管隐藏了基类的实现代码,但仍可以通过基类访问它。

  • 相关阅读:
    致远OA-A8协同管理软件无需登录getshell漏洞
    WordPress插件NextGEN Gallery <= 3.2.2 RCE漏洞利用(需要登录)
    Coremail邮件系统配置文件泄露漏洞
    CVE-2019-12735 VIM命令执行漏洞利用
    分享一个乌云Drops文章在线浏览的网站
    Ubuntu、Debian安装Docker CE
    一些好用的网络渗透工具和查询平台
    CVE-2017-11882 Office内存损坏漏洞利用
    Cobalt Strike入门教程-通过exe木马实现远控
    Jfinal cms前台评论XSS漏洞分析
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/4957954.html
Copyright © 2011-2022 走看看