我无法弄清楚这一点。问题是距离,俱乐部,清洁俱乐部,洞,分数和标准都说由于保护水平而无法进入,我不知道为什么因为我认为我做的一切都是正确的。
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();
}
}
}
答案 0 :(得分:23)
在您的基类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();
答案 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 构造函数覆盖它。