对于几种类型的“建筑物”,我有一堆常数值,其大小是固定的(由于它们将保持的3D模型)。
我环顾四周,阅读了基类,接口和摘要,但无法完全掌握这些概念。但是我真的很喜欢使用接口来“组织”具有公共字段的类。在这种情况下,sizeX和sizeY是在所有构建类中共享的字段类型。
$("td:nth-child(1)")
我是否可以通过某种方式为此实现接口,而无需在每个类中使用构造函数? (我想根据需要简单地调用这些常量,如下所示:)
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;
}
}
为了将来使用,如果我需要添加另一个字段(例如“height”),我希望编译器抛出错误并说“嘿!你忘了给House1一个”高度“值!
是否有人可以指向我这样的事情?
答案 0 :(得分:4)
在我看来,您的代码需要重新设计。我不明白你为什么要拥有所有这些公共子类。相反,我只会为所有建筑类型使用一个类(假设all始终具有相同的属性),并为该类的类型使用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);
}
请注意,此代码示例中的所有属性都是不可变的,并且,如果您将来添加属性,并且希望在缺少编译器时出现编译器错误,那么您只需要更改{的构造函数{1}}类为这个新的只读属性接受另一个参数。
答案 1 :(得分: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; } }
}
这样,您可以保留和维护每种类型的契约,同时仍然能够以静态方式访问每种类型的特定大小(无需实例化)。
答案 2 :(得分:-1)
你考虑过字典吗?
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)}
};