c# -声明常量字段,但是用接口组织

本文关键字:接口 声明 常量 字段 | 更新日期: 2023-09-27 18:12:15

我为几种类型的"建筑物"设置了一堆常量值,它们的大小是固定的(由于它们将保持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;
}

为了将来使用,如果我需要添加另一个字段(例如"height"),我希望编译器抛出一个错误并说"嘿!你忘了给House1一个"高度"值!

有这样的东西可以给我指一下吗?

c# -声明常量字段,但是用接口组织

在我看来你的代码需要一些重新设计。我不明白为什么你想要所有这些公共子类。相反,我将只使用一个类的所有建筑类型(假设所有总是有相同的属性)和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类的构造函数,以接受这个新的只读属性的另一个参数。

你可以简单地创建一个接口,声明两个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; } }
}

这样,你可以保留和维护每个类型的契约,同时仍然能够以静态的方式访问每个类型的特定大小(不需要实例化它)。

你考虑过字典吗?

            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)}
            };