c# foreach l oop со свойством класса недоступен - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть foreach l oop, который проходит через массив класса и имеет оператор if, который использует одно из свойств класса, однако он не работает. Я получаю эту ошибку:

Board.Boat.length не может быть доступен со ссылкой на экземпляр; вместо этого укажите имя типа.

Как вы решите это, вот код. Имейте в виду, что это все еще не закончено.

using System;
using System.Collections.Generic;
using System.Numerics;

namespace BattleShip
{
    class Board
    {
        class Boat
        {
            // This class is made for storing the meta-data of each individual boat

            // Determines the start point 
            static int[,] pos = new int[xBoardSize, yBoardSize];
            // Determines the direction of the boat (0 = horizontal, 1 = vertical)
            static int direction = 0;
            // Keeps track of the boat's size
            static int length = 1;
            // Keeps track if tile is hit or untouched
            static int[] stateList;

            // Searches fora oat object and
            static Boat SearchForBoat (Vector2 coords, Boat[] database)
            {
                foreach (Boat boat in database)
                {
                    for (int i = 0; i < boat.length; i++)
                }
            }

        }

        // These variables determine the size of the board
        static int xBoardSize = 10;
        static int yBoardSize = 10;
    }
}

Ответы [ 4 ]

0 голосов
/ 07 февраля 2020

Элемент stati c может вызываться для класса, даже если экземпляр класса не создан. Член stati c всегда доступен по имени класса, а не по имени экземпляра.

    for (int i = 0; i < boat.length; i++) //wrong access static from an instance
    for (int i = 0; i < Boat.length; i++) //correct access static from the type itself (class itlsef)

для получения дополнительной информации здесь *1007* для получения дополнительной информации

0 голосов
/ 07 февраля 2020

Ошибка сообщает, что вы пытаетесь получить доступ к свойству stati c из экземпляра объекта.

foreach (Boat boat in database) // give me each real boat from database
{
    for (int i = 0; i < boat.length; i++) // access an individual boat length

Однако, поскольку длина равна c, технически экземпляр лодки не имеет свойства, называемого length.

Я взял на себя ответственность перед SRP ( принцип единой ответственности) и нормализовал ваш код

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

Как таковой он удалил все ваши static guff

Используйте модификатор stati c, чтобы объявить член stati c, который скорее относится к самому типу чем указанный c объект.

public class Board
{
   // These variables determine the size of the board
   public const int XBoardSize = 10;
   public const int YBoardSize = 10;

   // a board has an array of boats, seems logical
   public Boat[] Boats { get; set; }

   // a board can find boats on it
   public Boat SearchForBoat(Vector2 coords )
   {
      foreach (var boat in Boats)
      {
         for (int i = 0; i < boat.Length; i++)
            /// do stuff here
      }
   }
}

// concrete boat class, which you can make instances from 
public class Boat
{
   // notice not static, we are saying an individual "boat" can have these properties
   public int[,] Pos = new int[Board.XBoardSize, Board.YBoardSize];
   public int Direction { get; set; }
   public int Length { get; set; } = 1;
   public int[] StateList { get; set; }

}
0 голосов
/ 07 февраля 2020

У меня есть несколько комментариев к вашему коду:

1-е сообщение c следует рассматривать как нечто уникальное. Это что-то вроде глобального значения, которое используется всеми экземплярами объекта

Начиная с Документация Microsoft по стати c

стати c член вызывается в классе, даже если экземпляр класса не создан. Член stati c всегда доступен по имени класса, а не по имени экземпляра. Существует только одна копия элемента stati c , независимо от того, сколько экземпляров класса создано.

С учетом этого ваш класс Boat станет:

public class Boat
{
       // This class is made for storing the meta-data of each individual boat

      // Determines the start point 
      public int[,] pos = new int[xBoardSize, yBoardSize];           
      // Determines the direction of the boat (0 = horizontal, 1 = vertical)
      public int direction = 0;
      // Keeps track of the boat's size
      public int length = 1;
      // Keeps track if tile is hit or untouched
      public int[] stateList;
}

Теперь ваши лодки должны стать частью вашей доски с отношением Has-A:

public class Board
    {
         private Boat[] boats;

         public Board(Boat[] boats) {
             // initialize th boats for the specific game
             this.boats = boats
         }

         Boat SearchForBoat (Vector2 coords)
         {
             foreach (Boat boat in boats)
             {
                 for (int i = 0; i < boat.length; i++)
             }
         }

          // These variables determine the size of the board
        int xBoardSize = 10;
        int yBoardSize = 10;
}

Затем вам нужно инициализироваться через конструктор и использовать указанные c instance

0 голосов
/ 07 февраля 2020

Это потому, что length свойство static. Такие свойства являются скорее свойствами класса, в то время как другие являются свойствами экземпляра, то есть поле static используется с типом (а другое - с экземпляром объекта класса). В вашем случае это должно быть Boat.length вместо boat.length.

Примечание: вы должны учитывать эти свойства c, так как length мне кажется, что он должен зависеть от конкретного объекта, поэтому должен не быть static.

...