C # — объявлять постоянные поля, но организовывать с помощью интерфейса?

#c#

#c#

Вопрос:

У меня есть куча постоянных значений для нескольких типов «зданий», размеры которых фиксированы (из-за 3D-модели, которую они будут содержать).

Я осмотрелся и прочитал о базовых классах, интерфейсах и аннотациях, но не смог полностью понять концепции. Однако мне очень понравилась идея использования интерфейсов для «организации» классов с общими полями. В этом случае sizeX и sizeY — это тип поля, общий для всех классов построения.

 public static class BuildingProperties {

public class House
{
    public const int sizeX = 4;
    public const int sizeY = 4;
}

public class House1
{
    public const int sizeX = 6;
    public const int sizeY = 6;
}

public class Commercial
{
    public const int sizeX = 10;
    public const int sizeY = 10;
}

}
  

Есть ли какой-нибудь способ реализовать интерфейс для этого, без необходимости в конструкторах в каждом классе? (Я хотел бы просто вызывать эти константы по мере необходимости, например:)

 public void program()
{
    int sizeX = BuildingProperties.House.sizeX;
}
  

И для будущего использования, если бы мне нужно было добавить еще одно поле (например, «высота»), я бы хотел, чтобы компилятор выдал ошибку и сказал «эй! вы забыли присвоить House1 значение «высота»!

Есть ли что-то подобное, на что кто-то может указать мне?

Комментарии:

1. Что, если вы просто объявите подклассы (например, House) статическими?

2. Мой предыдущий комментарий касался вашего ожидаемого синтаксиса в приведенной выше программе. Чтобы компилятор выдавал ошибки «Нет значения высоты для House1», вам нужно будет создать интерфейс или базовый класс и наследовать его в своих моделях. Тогда вам придется инициализировать экземпляры этих классов, поскольку статические свойства нельзя переопределить или указать в конструкторах

3. Никогда не используйте общедоступные поля — используйте только свойства getter! Вы также можете использовать их внутри интерфейса.

Ответ №1:

Мне кажется, что ваш код нуждается в некоторой доработке. Я не понимаю, почему вы хотели бы иметь все эти общедоступные подклассы. Вместо этого я бы просто использовал один класс для всех типов зданий (предполагая, что все всегда имеют одинаковые свойства) и 3 свойства для типа этого класса:

 public class Building
{
    public Building(int sizeX, int sizeY)
    {
        SizeX = sizeX;
        SizeY = sizeY;
    }

    public int SizeX { get; }
    public int SizeY { get; }
}

public static class BuildingProperties
{

    public static Building House { get; } = new Building(4, 4);

    public static Building House1 { get; } = new Building(6, 6);

    public static Building Commercial { get; } = new Building(10, 10);

}
  

Обратите внимание, что все свойства неизменяемы в этом примере кода, а также, если вы добавите свойство в будущем и захотите получать ошибки компилятора, когда оно отсутствует, все, что вам нужно сделать, это изменить конструктор Building класса, чтобы принять другой параметр для этого нового свойства только для чтения.

Комментарии:

1. Очевидно, что OP не разделял всю кодовую базу каждого класса, можно с уверенностью предположить, что они отличаются не только значениями const s

2. @haim770 Я в этом не уверен. Мне кажется, это скорее результат плохого дизайна кода.

3. Это прекрасно!

4. @ZoharPeled, если это так, то в a class вообще нет необходимости, вы можете получить простое struct представление этих значений. Кроме того, OP хотел иметь возможность доступа к размерам каждого типа статическим способом (без необходимости его создания).

5. Структуры @haim770, вероятно, были бы лучшим выбором, чем классы здесь, вы правы. однако обратите внимание, что мой образец также является статическим классом со статическими свойствами…

Ответ №2:

Вы можете просто создать интерфейс, который будет объявлять 2 свойства getter:

 public interface IProvideSizes
{
    int SizeX { get; }
    int SizeY { get; }
}
  

И в ваших классах они возвращают данные из вашего const :

 public class House : IProvideSizes
{
    public const int _sizeX = 4;
    public const int _sizeY = 4;

    public int SizeX { get { return _sizeX; } }
    public int SizeY { get { return _sizeY; } }
}

public class House1 : IProvideSizes
{
    public const int _sizeX = 6;
    public const int _sizeY = 6;

    public int SizeX { get { return _sizeX; } }
    public int SizeY { get { return _sizeY; } }
}

public class Commercial : IProvideSizes
{
    public const int _sizeX = 10;
    public const int _sizeY = 10;

    public int SizeX { get { return _sizeX; } }
    public int SizeY { get { return _sizeY; } }
}
  

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

Ответ №3:

Вы рассматривали словарь?

             Dictionary<string, System.Drawing.Point> properties = new Dictionary<string, System.Drawing.Point>() {
                {"House", new System.Drawing.Point(4,4)},
                {"House1", new System.Drawing.Point(6,6)},
                {"Commercial", new System.Drawing.Point(10,10)}
            };