Как установить атрибуты в мастер-классе и использовать их в подклассах? - PullRequest
0 голосов
/ 24 февраля 2020

Я начинаю свой сторонний проект, и одна из моих целей - научиться лучше использовать Classes и Subclasses. Однако я столкнулся с проблемой, поскольку пытался сделать что-то, что я должен был делать раньше в Java для моего курса, но я не уверен, как это сделать в C#.

Моя проблема в том, что я хочу определить данный атрибут в мастер-классе, и у каждого подкласса есть свое собственное значение для указанного атрибута (примечание, каждый подкласс, , а не каждый экземпляр).

Я посмотрел, как работают атрибуты и классы в C#, но я не совсем понял документы по этому вопросу.

Я довольно плохо знаком с классами в C#, поэтому, если отвечать go, простота предпочтительнее эффективности.

Вот код, с которым я работаю:

class Rooms
{
     protected static bool sameDir(char[] dir1, char[] dir2)
     {
         if(dir1.Length != dir2.Length) 
         { 
             return false;
         }
         bool check;
         foreach (char item1 in dir1)
         {
             check = false;
             foreach(char item2 in dir2)
             {
                 if(item1 == item2)
                 {
                     check = true;
                     break;
                 }
             }
             if(check = false) 
             {
                 return false;
             }
         }
         return true;
     }

     protected char[] rdir { get; set; }
     public char[] getrdir() { return rdir; }
     protected string enterText;
     public string getEnterText() { return enterText; }
     static public Rooms getRoom(char[] dir, int id = -1)
     {
         List<Rooms> allRooms = new List<Rooms>();
         #region Add an instance of every type of room
         allRooms.Add(new Entrance());
         allRooms.Add(new ChestRoom());
         allRooms.Add(new MonsterRoom());
         allRooms.Add(new PlaceholderRoom());
         #endregion

         List<Rooms> requested = new List<Rooms>();

         foreach(Rooms room in allRooms) 
         {
             if(sameDir(dir, room.getrdir()))
             { 
                 //Checks if the array of directions entered has the same elements as the arrays' directions.
                 requested.Add(room);
              }
         }

         if (id == -1)
         { 
              //Checks if the user had chosen to give an id
              Random random = new Random();
              return requested[random.Next(0, requested.Count)];
         }
         return allRooms[id];
      }
}

class Entrance : Rooms
{
    public char[] getrdir()
    { 
        return new char[1] { 'w' }; 
    }
    public string enterText() 
    { 
        return "You arrive at the opening of a cave.\n"; 
    }
}

class ChestRoom : Rooms 
{
    public char[] getrdir()
    { 
        return new char[2] { 'w', 's' }; 
    }

    public string enterText()
    { 
        return "You enter a somewhat fancy room, with a chest in the middle of the room.\n";
    }
}

Более подробно: я делаю текстовое приключение, используя Winforms. Я собираюсь сделать каждый из типов комнат как Subclass из Masterclass Rooms. В моей функции Rooms я создал функцию, которая должна вызывать меня для нового экземпляра комнаты, чтобы обеспечить как случайную планировку подземелья, так и убедиться, что каждая комната имеет смежную доступную комнату на дверь.

Проблема, к которой привела моя текущая попытка, состоит в том, что мой массив символов rdir всегда пуст, иначе он не принимает значение, как определено в Subclasses. Я хочу иметь возможность установить атрибут в Masterclass, чтобы иметь функцию getRoom, но установить значение rdir для каждой комнаты отдельно.

Поэтому меня попросили упростить мою цель немного. Я хочу class для каждого отдельного типа комнаты. Я хочу, чтобы в каждой комнате была указана информация о том, как игрок может go из указанной комнаты, это должно быть одинаково для всех instance той же комнаты. Ака каждая входная комната должна только иметь 1 направление, на которое игрок может go, и это вперед.

Я также хочу иметь возможность получить комнату запрашивая конкретные c направления. Ака, я хочу иметь возможность получить комнату с указанием c направлений, по которым игрок может пройти по ней.

Надеюсь, это поможет?

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