C#:访问修饰符使方法调用不同
C#: Access modifier make method invoke differently
首先,这是代码,结果是预期的:
代码 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:
Derived class
Base class
但是,如果我将两个 classes 的 Run()
访问修饰符从 public
更改为 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();
}
}
}
结果 2:
Base class
Base class
我的问题是,在protected
也允许派生class访问基class作为public
的情况下,为什么结果会不同?
DerivedClass.Run
受到保护,所以 Base
甚至看不到它。它调用继承自 Base
的 Run
方法。
您的 main
函数在 Base
中,并且可以访问 Base
实例上的 public/private/protected 成员以及访问 public 实例上的成员DerivedClass
.
实例
首先,这是代码,结果是预期的:
代码 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:
Derived class
Base class
但是,如果我将两个 classes 的 Run()
访问修饰符从 public
更改为 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();
}
}
}
结果 2:
Base class
Base class
我的问题是,在protected
也允许派生class访问基class作为public
的情况下,为什么结果会不同?
DerivedClass.Run
受到保护,所以 Base
甚至看不到它。它调用继承自 Base
的 Run
方法。
您的 main
函数在 Base
中,并且可以访问 Base
实例上的 public/private/protected 成员以及访问 public 实例上的成员DerivedClass
.