由于其保护级别而无法访问

时间:2011-05-25 13:18:38

标签: c#

我无法弄清楚这一点。问题是距离,俱乐部,清洁俱乐部,洞,分数和标准都说由于保护水平而无法进入,我不知道为什么因为我认为我做的一切都是正确的。

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();    
        }
    }
}

9 个答案:

答案 0 :(得分:23)

在您的基类Clubs中,以下内容声明为protected

  • 俱乐部;
  • 距离;
  • cleanclub;
  • 得分;
  • 参数;
  • 孔;

这意味着这些只能由类本身或任何派生自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();

答案 1 :(得分:5)

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

例如,请参阅Main(...)中的这一行:

myClub.distance = Console.ReadLine();

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

我只是给你一些提示,我不打算更改你的代码,因为这是功课! ;)

答案 2 :(得分:4)

myClub.distance = Console.ReadLine();

应该是

myClub.mydistance = Console.ReadLine(); 

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

myScoreonHole.hole = Console.ReadLine();

你应该写

myScoreonHole.myhole = Console.ReadLine();

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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();    
        }
    }
}

答案 7 :(得分:0)

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

blog

中说明了不允许的原因

答案 8 :(得分:0)

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

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

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