C # «недоступен из-за своего уровня защиты» ошибка в конструкторе - PullRequest
6 голосов
/ 16 марта 2011

Конструктор дочернего класса "Цезарь" выдает ошибку.Он говорит, что имя, тип недоступен из-за уровня защиты.Как так?Поскольку это дочерний класс, производный от класса "Cipher", он не должен выдавать ошибку, подобную этой.Как я могу преодолеть эту ситуацию.Но я хочу, чтобы эти переменные были приватными.Я не хочу менять их как общедоступные.

*** Второй пример кода работает.Кто-нибудь может увидеть разницу?

namespace Encrypter
{
    class Cipher
    {
        public Cipher(string name, string type)
        {
            setName(name);
            setType(type);

        }
        private string name;
        private string type;

        public void setName(string newName)
        {
            name = newName;
        }
        public string getName()
        {
            return name;
        }
        public void setType(string newType)
        {
            type = newType;
        }
        public string getType()
        {
            return type;
        }
        public string encrypt(string text)
        {
            return text;
        }
        public string decrypt(string text)
        {
            return text;
        }
    }
}




namespace Encrypter
{
    class Caesar : Cipher
    {

        private int shiftamount;
        private string shiftdirection;
        public Caesar(int shiftamount, string shiftdirection) : base(name, type)
        {
            setShiftamount(shiftamount);
            setShiftdirection(shiftdirection);
        }
        public void setShiftamount(int newShiftamount)
        {
            shiftamount = newShiftamount;
        }
        public int getShiftamount()
        {
            return shiftamount;
        }
        public void setShiftdirection(string newShiftdirection)
        {
            shiftdirection = newShiftdirection;
        }
        public string getShiftdirection()
        {
            return shiftdirection;
        }

    }
}

----------------------------- Новое редактирование ----------------

class MyFile
    {
        public MyFile(int id, string name, int size, string type)
        {
            setId(id);
            setName(name);
            setSize(size);
            setType(type);

        }
        private int id;
        private string name;
        private string type;
        private int size;




class Movie : MyFile
    {
        private string director;
        private int release_year;
        public Movie(string director, int release_year, int id, string name, int size) : base( id,  name,  size, "m")
        {
            setDirector(director);
            setRelease_year(release_year);
        }

Ответы [ 4 ]

7 голосов
/ 16 марта 2011

Похоже, вы ошиблись в определении конструктора производного класса. Если вы хотите получить значения name и type в суперклассе, вам нужно будет передать их как дополнительные аргументы конструктора (всего 4 аргумента в конструкторе производного класса.) Например, изменив его на этот должно работать:

    public Caesar(int shiftamount, 
                  string shiftdirection, 
                  string name, 
                  string type) 
                  : base(name, type)

Существует ряд других стратегий, которые вы можете использовать.

5 голосов
/ 16 марта 2011
    public Caesar(int shiftamount, string shiftdirection)
        : base(name, type)
    {

Проблема заключается в имени и типе полей private - дочерний класс не может получить к ним доступ, если они не помечены как protected. Я подозреваю, что ты действительно хочешь это

    public Caesar(int shiftamount, string shiftdirection)
        : base("Caesar5", "Caesar")
    {
4 голосов
/ 16 марта 2011

Закрытые члены не могут быть доступны из производных классов. охраняемая и общественная Вы должны сделать их защищенными. Таким образом, только класс и его «дети» будут иметь доступ.

Сводка прав доступа:

  • private: доступен только из методов этого класса, ничего больше
  • protected: можно получить из методов этого класса и его детей
  • internal: доступен только из методов в той же сборке
  • protected internal: аналогично внутренним + методам производных классов из других сборок
  • public: доступен для всех
3 голосов
/ 16 марта 2011

private означает, что только декларирующий класс может получить доступ к членам (это означает, что унаследованные типы также не могут).

protected означает, что декларирующий класс и любые потомки могут иметь доступ к членам, но типы вне их не могут.

В другом примечании функции получения и установки обычно не используются в языках .NET. Свойства инкапсулируют эту функциональность и являются тем, что следует использовать вместо этого. Например;

private string name;

public string Name
{
    get { return name; }
    set { name = value; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...