Подтвердить что ты не робот

Недоступен из-за его уровня защиты

Я не могу понять это. Проблема в том, что дистанция, клуб, 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();    
        }
    }
}
4b9b3361

Ответ 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