#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
s2. @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)}
};