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

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

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

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

  • 俱乐部;
  • 距离;
  • cleanclub;
  • 分数;
  • 比肩;
  • 洞;

这意味着这些只能由class级本身或任何来自Clubs的class级访问。

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

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

例如,在Main(...)查看此行:

myClub.distance = Console.ReadLine();

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

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

 myClub.distance = Console.ReadLine(); 

应该

 myClub.mydistance = Console.ReadLine(); 

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

在您的Main方法中,当您访问myclub时,您正试图访问club (受保护的),这是您创建的公共财产。

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

 myScoreonHole.hole = Console.ReadLine(); 

你应该写

 myScoreonHole.myhole = Console.ReadLine(); 

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

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

本博客解释了不允许的原因

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

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