C#中的受保护方法继承

问题描述 投票:-2回答:1

我在阅读了关于受保护访问修饰符的文档后写了一段简单的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 memberWeaponController.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 typeSMGController'。 限定符必须是类型为 "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 typeSMGController'。限定符必须是类型为 "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个警告

我的代码有什么问题?

c# oop inheritance protected
1个回答
3
投票

你不能调用 protected 方法,即从类外调用 WeaponController.ShootTest.

此外,如果你覆盖了一个 protected 方法,它必须是 protected,也是。

很明显,你想 ReloadShoot 将要 public所以你可以从 Test.Main.


1
投票

protected 修饰语的意思是 只是 类本身或子类可以访问 Shoot.

你正试图从其他类访问它。Test 没有继承关系的 SMGControllerWeaponController而这种访问是被禁止的。protected 修饰语。

参考,见 https:/docs.microsoft.comen-usdotnetcsharplanguag-referencekeywordsprotected。特别是第一节的这一行。

一个受保护的成员可以在其类中被访问,也可以被派生类实例访问。

你可以通过将 Shoot public. 或者如果你坚持要保留它 protected,那么你就需要添加一个方法,如 public PublicShoot() 的方法,然后调用被保护的方法。

© www.soinside.com 2019 - 2024. All rights reserved.