我在阅读了关于受保护访问修饰符的文档后写了一段简单的C#代码,但我收到了很多不合逻辑的错误。我找不到任何解决方案。
using System;
public class WeaponController
{
protected void Reload()
{
Console.WriteLine("Reload");
}
protected virtual void Shoot()
{
}
}
public class SMGController : WeaponController
{
private override void Shoot()
{
Console.WriteLine("Shoot");
}
}
public class Test
{
public static void Main()
{
var test = new SMGController();
test.Shoot();
test.Reload();
}
}
而且我收到了以下错误。
prog.cs(19,27): 错误 CS0621:
SMGController.Shoot()': virtual or abstract members cannot be private prog.cs(19,27): error CS0507:
SMGController.Shoot()': Overriding时不能改变访问修饰符。protected' inherited member
WeaponController.Shoot()' prog.cs(10,25)。(与前一个错误相关的符号的位置) 编译失败:2个错误,0个警告。
如果我将SMGController中的Shoot()方法的访问修饰符改为protected,我收到的错误更多。
prog.cs(30,8): error CS1540: Cannot access protected member.
WeaponController.Shoot()' via a qualifier of type
SMGController'。 限定符必须是类型为 "SMGController"。Test' or derived from it prog.cs(10,25): (Location of the symbol related to previous error) prog.cs(30,8): error CS0122:
WeaponController.Shoot()'由于其保护级别的原因无法访问 prog.cs(10,25)。(与之前错误相关的符号的位置) prog.cs(31,8): 错误 CS1540: 无法访问受保护的成员。WeaponController.Reload()' via a qualifier of type
SMGController'。限定符必须是类型为 "SMGController"。Test' or derived from it prog.cs(5,17): (Location of the symbol related to previous error) prog.cs(31,8): error CS0122:
WeaponController.Reload()'由于其保护级别 prog.cs(5,17)而无法访问。(与之前错误相关的符号位置) 编译失败。4个错误,0个警告
我的代码有什么问题?
你不能调用 protected
方法,即从类外调用 WeaponController.Shoot
从 Test
.
此外,如果你覆盖了一个 protected
方法,它必须是 protected
,也是。
很明显,你想 Reload
和 Shoot
将要 public
所以你可以从 Test.Main
.
该 protected
修饰语的意思是 只是 类本身或子类可以访问 Shoot
.
你正试图从其他类访问它。Test
没有继承关系的 SMGController
和 WeaponController
而这种访问是被禁止的。protected
修饰语。
参考,见 https:/docs.microsoft.comen-usdotnetcsharplanguag-referencekeywordsprotected。特别是第一节的这一行。
一个受保护的成员可以在其类中被访问,也可以被派生类实例访问。
你可以通过将 Shoot
public
. 或者如果你坚持要保留它 protected
,那么你就需要添加一个方法,如 public PublicShoot()
的方法,然后调用被保护的方法。