【问题标题】:is inaccessible due to its protection level由于其保护级别而无法访问
【发布时间】:2011-09-01 18:38:21
【问题描述】:

我想不通。问题是距离、俱乐部、清洁俱乐部、洞、分数和标准杆都说由于保护级别而无法访问,我不知道为什么,因为我认为我做的一切都是正确的。

namespace homeworkchap8
{
    public class Clubs
    {
        protected string club;
        protected string distance;
        protected string cleanclub;
        protected string scores;
        protected string par;
        protected string hole;            

        public string myclub
        {
            get { return club; }
            set {club = value; }
        }        
        public string mydistance
        {
            get { return distance; }
            set { distance = value; }
        }        
        public string mycleanclub
        {
            get { return cleanclub; }
            set { cleanclub = value; }
        }       
        public string myscore
        {
            get { return scores; }
            set { scores = value; }
        }       
        public string parhole
        {
            get { return par; }
            set { par = value; }
        }       
        public string myhole
        {
            get { return hole; }
            set { hole = value;}
        }
    }   
}

这是派生类:

namespace homeworkchap8
{
    public class SteelClubs : Clubs, ISwingClub
    {
        public void SwingClub()
        {
            Console.WriteLine("You hit a " + myclub + " " + mydistance);
        }

        public void clean()
        {
            if (mycleanclub != "yes")
            {
                Console.WriteLine("your club is dirty");
            }
            else
            {
                Console.WriteLine("your club is clean");
            }
        }

        public void score()
        {   
            Console.WriteLine("you are on hole " + myhole + " and you scored a " + 
                myscore + " on a par " + parhole);
        }            
    }
}

这是界面:

namespace homeworkchap8
{
    public interface ISwingClub
    {
        void SwingClub();
        void clean();
        void score();
    }  
}

这里是主要代码:

namespace homeworkchap8
{
    class main
    {    
        static void Main(string[] args)
        {    
            SteelClubs myClub = new SteelClubs();
            Console.WriteLine("How far to the hole?");
            myClub.distance = Console.ReadLine();
            Console.WriteLine("what club are you going to hit?");
            myClub.club = Console.ReadLine();
            myClub.SwingClub();

            SteelClubs mycleanclub = new SteelClubs();
            Console.WriteLine("\nDid you clean your club after?");
            mycleanclub.cleanclub = Console.ReadLine();
            mycleanclub.clean();

            SteelClubs myScoreonHole = new SteelClubs();
            Console.WriteLine("\nWhat hole are you on?");
            myScoreonHole.hole = Console.ReadLine();
            Console.WriteLine("What did you score on the hole?");
            myScoreonHole.scores = Console.ReadLine();
            Console.WriteLine("What is the par of the hole?");
            myScoreonHole.par = Console.ReadLine();

            myScoreonHole.score();

            Console.ReadKey();    
        }
    }
}

【问题讨论】:

  • 欢迎来到 SO。请尝试使用代码小部件格式化您的代码,并避免使用 txtspk。这次我编辑了你的问题来整理一下。

标签: c#


【解决方案1】:

虽然与手头的案例无关,但为了下一个通过搜索引擎到达本文的人的利益,如果你的基类的默认构造函数被标记为private,派生类将引发 CS0122 诊断。

相反,您必须将私有方法提升受保护

派生类的消费者仍然无法访问受保护的方法,除非该类使用 new 构造函数覆盖它。

【讨论】:

    【解决方案2】:

    原因是您无法通过类的实例访问受保护的成员数据。

    blog 解释了为什么不允许这样做的原因。

    【讨论】:

      【解决方案3】:

      这是因为您无法通过其类实例访问受保护的成员数据。 您应该按如下方式更正您的代码:

      namespace homeworkchap8
      {
          class main
          {    
              static void Main(string[] args)
              {    
                  SteelClubs myClub = new SteelClubs();
                  Console.WriteLine("How far to the hole?");
                  myClub.mydistance = Console.ReadLine();
                  Console.WriteLine("what club are you going to hit?");
                  myClub.myclub = Console.ReadLine();
                  myClub.SwingClub();
      
                  SteelClubs mycleanclub = new SteelClubs();
                  Console.WriteLine("\nDid you clean your club after?");
                  mycleanclub.mycleanclub = Console.ReadLine();
                  mycleanclub.clean();
      
                  SteelClubs myScoreonHole = new SteelClubs();
                  Console.WriteLine("\nWhat hole are you on?");
                  myScoreonHole.myhole = Console.ReadLine();
                  Console.WriteLine("What did you score on the hole?");
                  myScoreonHole.myscore = Console.ReadLine();
                  Console.WriteLine("What is the par of the hole?");
                  myScoreonHole.parhole = Console.ReadLine();
      
                  myScoreonHole.score();
      
                  Console.ReadKey();    
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        在您的基类Clubs 中,声明了以下protected

        • 俱乐部;
        • 距离;
        • 干净的俱乐部;
        • 分数;
        • 标准;
        • 洞;

        这意味着这些只能由类本身或派生自Clubs的任何类访问。

        在您的main 代码中,您尝试在类本身之外访问这些。例如:

        Console.WriteLine("How far to the hole?");
        myClub.distance = Console.ReadLine();
        

        您已经(有些正确)为这些变量提供了公共访问器。例如:

        public string mydistance
        {
            get
            {
                return distance;
            }
            set
            {
                distance = value;
            }
        }        
        

        这意味着您的主要代码可以更改为

        Console.WriteLine("How far to the hole?");
        myClub.mydistance = Console.ReadLine();
        

        【讨论】:

          【解决方案5】:

          您组织了类接口,使公共成员以“my”开头。因此,您必须只使用这些成员。而不是

          myScoreonHole.hole = Console.ReadLine();
          

          你应该写

          myScoreonHole.myhole = Console.ReadLine();
          

          【讨论】:

            【解决方案6】:
            myClub.distance = Console.ReadLine();
            

            应该是

            myClub.mydistance = Console.ReadLine(); 
            

            使用您为其他人定义的公共属性,而不是受保护的字段成员。

            【讨论】:

            • 非常感谢,因为没有看到或至少尝试过,我感到很愚蠢
            【解决方案7】:

            您需要使用来自Main的公共属性,而不是尝试直接更改内部变量。

            【讨论】:

              【解决方案8】:

              在您的 Main 方法中,您尝试访问例如 club(受保护),而您应该访问 myclub,这是您创建的公共属性。

              【讨论】:

                【解决方案9】:

                Dan,你只是在访问受保护的字段而不是属性。

                例如在您的Main(...) 中查看这一行:

                myClub.distance = Console.ReadLine();

                myClub.distance 是受保护的字段,而您想设置属性 mydistance

                我只是给你一些提示,我不会更正你的代码,因为这是家庭作业! ;)

                【讨论】:

                  猜你喜欢
                  • 2015-09-26
                  • 1970-01-01
                  • 2011-04-02
                  • 2011-02-07
                  • 2012-01-25
                  • 2022-01-18
                  • 2019-06-28
                  相关资源
                  最近更新 更多