【发布时间】:2011-11-15 22:46:57
【问题描述】:
我需要一种方法来创建一个静态类,其中一些常量可以是特定大小写的,但是是硬编码的。
我真正想做的是有一个类,在扩展类时提供几个常量 - 我想要硬编码的“常量”。我想我将创建一些抽象属性并定义 get { return constant; } 扩展类时。
我知道这是不可能的,所以现在我面临两个选择,我想知道什么是最好的以及为什么(如果有我遗漏的选项,请告诉我!)
- 创建具有可为空字段的静态类,并在调用静态方法时如果字段为空则引发异常。
- 放弃静态类。拥有一个具有抽象属性的非静态类,并在我需要的任何地方创建对象的实例,即使所有功能都是静态的。
我知道这可能是主观的并且取决于具体情况,但是在考虑这个问题时我会绕圈子,并且确实可以使用一些外部输入。再加上我希望可能不会做我想做的事,我只是在想这个错误。
更新:代码:我将尝试编写一些代码来描述我想要完成的工作。 我知道这段代码行不通!
想象一下,抽象类 Calculation 在一个 dll 中,被许多项目使用。它们的功能都是相同的,只是常量因项目而异。
public abstract static class Calculation
{
private abstract int Constant { get; } //The constant is unknown at this time
public static int Calculate(int inputValue)
{
return inputValue * Constant;
}
}
类 Calc 是在一个单独的项目中定义的,该项目需要该功能并且常量是已知的。
public static class Calc : Calculation
{
private override int Constant { get { return 2; }
}
...
static class Program
{
[STAThread]
static void Main()
{
//At some point:
int result = Calc.Calculate(6);
}
}
我想最简单的方法是创建一个非静态类并创建一个实例,但是我担心拥有该类的多个实例可能会很昂贵,并且希望尽可能避免这种情况。
如果不在每个项目中再次编写它,我看不出如何将其编写为单例模式 - 在 dll 中只有 Nested 类。这并不妨碍实现者只创建一个普通的类,并且可能会为每个使用该代码的项目重新展开辩论。
更新#2:我对选项一的看法是:
dll 中的类:
public static class Calculation
{
public int? Constant {get; set;}
public static int Calculate(int inputValue)
{
if (Constant == null)
throw new ArgumentNullException();
return inputValue * (int)Constant;
}
}
函数在单独项目中的使用:
static class Program
{
[STAThread]
static void Main()
{
//At some point:
Calculation.Constant = 2;
int result = Calc.Calculate(6);
}
}
选项一非常简单和优雅,令我困扰的是没有强制实现者设置常量。我担心一个(不可否认的)场景,一个不起眼的角落案例会导致属性无法设置并且代码失败(并且不断地成为最后一个嫌疑人)......
【问题讨论】:
-
为什么你认为你需要一个静态类?您所说的“特定于案例,但硬编码”是什么意思?你能发布一个具体的例子吗?
-
您不能扩展(继承)静态类,那么您的方案到底是什么?一小段代码值一千字。
-
你能描述一下使用一些示例——可能是不可编译的——代码吗?
-
我同意 Joachim,改用 Singleton。如果您需要有关 Singleton 的帮助,请查看 Jon Skeet 的 Singleton 文章。
-
这里没有静态类(甚至是单例 imo)。
标签: c# static derived-class