如何在 Sub Class 方法中使用 Parent Class 变量名

How to use Parent Class variable name in the Sub Class method

我尝试使用 C# 创建简单的控制台应用程序。我想用 我的申请。

在我的团队中 Class 有这些方法。

  1. 一个成员变量 - teamName(string)
  2. 一个成员变量 - noOfPlayers(int)
  3. 构造函数 1.it 接受 2 个参数并将它们分别分配给 teanName 和 noOfPlayers。
  4. 成员函数AddPlayer(count) 1.it 将整数计数作为参数并按计数增加 noOfPlayers。
  5. 成员函数RemovePlayer 1.it 将整数计数作为参数并尝试按计数减少 onOfPlayers。 2.If decreasign 使 noOfPlayers 为负,那么这个函数只是 return false 3.Else 按计数减少 noOfPlayers 并且 return 正确。

在我的小组 class 中(继承自小组 class)有这些方法。

  1. 构造函数。 1.It 采用 2 个参数 teamName 和 noOfPlayers 并调用基础 class 构造函数 这些参数。
  2. 成员函数 ChangeTeamName
    1. 它以字符串名称作为参数,并将 teamName 更改为名称。

在我的 ChangeTeamName 方法中,我需要使用名称参数并将名称更改为团队名称。但我不知道该怎么做。请帮我用上面的任务创建这个简单的应用程序。并请检查其他代码是否正确。

我在尝试 运行 编程时遇到了这些错误。

1.Severity 代码说明项目文件行抑制状态 错误 CS1061 'Program.Subteam' 不包含 'onOfPlayers' 的定义,并且无法找到接受类型 'Program.Subteam' 的第一个参数的可访问扩展方法 'onOfPlayers'(您是否缺少 using 指令或程序集参考?) ConsoleApp1 C:\Users\Sandanuwan\Desktop\ConsoleApp1\ConsoleApp1\Program.cs 74 Active

2.Severity 代码说明项目文件行抑制状态 错误 CS0122 'Program.Team.noOfPlayers' 由于其保护级别 ConsoleApp1 C:\Users\Sandanuwan\Desktop\ConsoleApp1\ConsoleApp1\Program.cs 68 Active

而无法访问
   namespace ConsoleApp1
    {
    public partial class Program
    {
        public class Team
        {
            string teamName;
            int noOfPlayers;

            public Team(string teamName, int noOfPlayers)
            {
                this.teamName = teamName;
                this.noOfPlayers = noOfPlayers;
            }
            public void AddPlayer(int count)
            {
                noOfPlayers = count++;
            }

            public  bool RemovePlayer(int count)
            {
                noOfPlayers = count--;
               
                if (noOfPlayers < 0)
                {
                    return false;
                }               
                return true;
            }           
        }

        class Subteam : Team
        {
            public Subteam(string teamName, int noOfPlayers) : base(teamName, noOfPlayers)
            {
               
            }

            public void ChangeTeamName(string name)
            {
                
            }
        }
        static void Main(string[] args)
        {
            if(!typeof(Subteam).IsSubclassOf(typeof(Team)))
            {
                throw new Exception("Subteam class chould inherit from Team class");
            }

            String str = Console.ReadLine();
            String[] strArr = str.Split();
            string initialName = strArr[0];
            int count = Convert.ToInt32(strArr[1]);
            Subteam teamObj = new Subteam(initialName, count);
            Console.WriteLine("Team " + teamObj.teamName + " created");

            str = Console.ReadLine();
            count = Convert.ToInt32(str);
            Console.WriteLine("Current number of players in team " + teamObj, teamName + " is " + teamObj.noOfPlayers);
            teamObj.AddPlayer(count);
            Console.WriteLine("New number of players in team " + teamObj.teamName + " is " + teamObj.onOfPlayers);

            str = Console.ReadLine();
            count = Convert.ToInt32(str);
            Console.WriteLine("Current number of players in team " + teamObj.teamName + " is " + teamObj.onOfPlayers);
            var res = teamObj.RemovePlayer(count);
            if(res)
            {
                Console.WriteLine("New number of players in team " + teamObj.teamName + " is " + teamObj.onOfPlayers);
            } else
            {
                Console.WriteLine("Number of players in team " + teamObj.teamName + " remains same");
            }

            str = Console.ReadLine();
            teamObj.ChangeTeamName(str);
            Console.WriteLine("Team name of team " + initialName + " changed to " + teamObj.teamName);
        }
    }
}

如果我对你的理解正确,并且你不想在 Team class 上使用 ChangeTeamName 方法,那么你需要创建 teamName 字段protected 以便派生 SubTeam class 可以访问和修改它。

您尚未向 teamName 字段添加访问修饰符,因此它具有默认访问权限 private,这意味着它只能从其定义的 class 内部读取或更改在, Team class.

protected 意味着它可以从这个 class 本身访问并派生(子)classes.

internal 表示它可以被同一程序集(dll 或项目)中的任何 class 访问。

public表示可以从任何地方访问。

我建议使用 属性 而不是 class 进行 protected 访问。

public class Team
{
    protected string TeamName { get; set; }
    int noOfPlayers;

    public Team(string teamName, int noOfPlayers)
    {
        this.TeamName = teamName;
        this.noOfPlayers = noOfPlayers;
    }

    etc.
}
class Subteam : Team
{
    public Subteam(string teamName, int noOfPlayers) : base(teamName, noOfPlayers)
    {           
    }

    public void ChangeTeamName(string name)
    {
        this.TeamName = name;
    }
}

您可能 运行 遇到了这个问题,因为指定 none 时的默认保护级别是私有的,因此派生的 class 无法访问基的变量。您可以将其更改为受保护,以便派生的 classes 可以使用该变量,或者(尽管可能不推荐)将其完全设为 public。

using System;
using System.Collections.Generic;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
        (new C() {Index = 1}).Print();
    }
}

public class B
{
    public int Index {get; set;}
}

public class C : B {
    public void Print(){
        Console.WriteLine(this.Index);
    }
}