C#中受保护的方法继承

阅读有关受保护的访问修饰符的文档后,我编写了一个简单的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()':在以下情况下无法更改访问修饰符 覆盖protected' inherited member WeaponController.Shoot()' prog.cs(10,25):(与先前错误相关的符号位置) 编译失败:2个错误,0个警告

如果我将SMGController中的Shoot()方法的访问修饰符更改为保护状态,则会收到更多错误:

prog.cs(30,8):错误CS1540:无法访问受保护的成员 WeaponController.Shoot()' via a qualifier of type 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'。限定词必须是类型 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个警告

我的代码有什么问题?

iCMS 回答:C#中受保护的方法继承

您不能从类外部调用protected方法,即不能从WeaponController.Shoot调用Test

此外,如果您覆盖protected方法,那么它也必须是protected

很显然,您希望ReloadShootpublic,因此可以从Test.Main对其进行呼叫。

,

protected修饰符意味着类本身或子类可以访问Shoot

您正试图从与TestSMGController都没有继承关系的某个其他类WeaponController访问它,并且protected修饰符禁止这种访问

有关参考,请参见https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/protected,尤其是第一部分中的以下行:

受保护的成员可以在其类中以及派生的类实例进行访问。

您可以通过设置Shoot public来解决此问题。或者,如果您坚持保留protected,则需要添加一个方法,例如public PublicShoot()然后调用受保护的方法。

本文链接:https://www.f2er.com/2292539.html

大家都在问