C#:Access修饰符make方法以不同方式调用

时间:2016-09-16 12:50:20

标签: c# access-modifiers

首先,这是代码,结果是期望的:

代码1:

using System;

namespace ConsoleApplication11
{
    class DerivedClass : Base
    {
        public new void Run()
        {
            Console.WriteLine("Derived class");
        }
    }

    class Base
    {
        public void Run()
        {
            Console.WriteLine("Base class");
        }

        static void Main(string[] args)
        {
            DerivedClass dc = new DerivedClass();
            Base bc = new Base();

            dc.Run();
            bc.Run();
        }
    }
}

结果1:

  

派生类

     

基础课程

但是,如果我改变了两个班级'从Run()public的{​​{1}}访问修饰符,事情变得不合时宜了:

代码2:

protected

结果2:

  

基础课程

     

基础课程

我的问题是,在using System; namespace ConsoleApplication11 { class DerivedClass : Base { protected new void Run() { Console.WriteLine("Derived class"); } } class Base { protected void Run() { Console.WriteLine("Base class"); } static void Main(string[] args) { DerivedClass dc = new DerivedClass(); Base bc = new Base(); dc.Run(); bc.Run(); } } } 也允许派生类以protected的形式访问基类的情况下,为什么结果会有所不同?

2 个答案:

答案 0 :(得分:3)

DerivedClass.Run受到保护,因此Base甚至看不到它。它调用从Run继承的Base方法。

答案 1 :(得分:2)

您的main函数位于Base,可以访问Base实例上的公共/私有/受保护成员,并可以访问{{1}个实例上的公共成员}。