Недоступен из-за его уровня защиты
Я не могу понять это. Проблема в том, что дистанция, клуб, cleanclub, дыра, партитуры и пара все говорят, что они недоступны из-за уровня защиты, и я не знаю, почему, потому что я думал, что все сделал правильно.
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();
}
}
}
Ответы
Ответ 1
В базовом классе 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();
Ответ 2
Дэн, вы просто получаете доступ к защищенному полю вместо свойств.
См., например, эту строку в Main(...)
:
myClub.distance = Console.ReadLine();
myClub.distance
- это защищенное поле, в то время как вы хотели установить свойство mydistance.
Я просто даю вам какой-то намек, я не буду исправлять ваш код, так как это домашнее задание!;)
Ответ 3
myClub.distance = Console.ReadLine();
должен быть
myClub.mydistance = Console.ReadLine();
используйте свои общедоступные свойства, которые вы определили для других, а не для защищенных членов поля.
Ответ 4
В вашем основном методе вы пытаетесь получить доступ, например, к club
(который защищен), когда вы должны получить доступ к myclub
, который является общедоступным свойством, которое вы создали.
Ответ 5
Вы организовали интерфейс класса, чтобы публичные участники начинали с "моего". Поэтому вы должны использовать только тех членов. Вместо
myScoreonHole.hole = Console.ReadLine();
вам следует написать
myScoreonHole.myhole = Console.ReadLine();
Ответ 6
Вам нужно использовать общедоступные свойства из Main
, а не пытаться напрямую изменять внутренние переменные.
Ответ 7
Это потому, что вы не можете получить доступ к защищенным данным элемента через свой экземпляр класса.
Вы должны исправить свой код следующим образом:
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();
}
}
}
Ответ 8
Причина, по которой вы не можете получить доступ к защищенным данным элемента через экземпляр класса.
Причина, почему это недопустимо, объясняется в этом blog