c# – 在父方法中访问子节点的静态属性 – 设计注意事项
|
我在
Accessing a static property of a child in a parent method之后遇到了类似的问题.首选答案提示类的设计有缺陷,需要更多信息来讨论问题.
这是我想和你讨论的情况. 我想实现一些单位感知数据类型,如长度,质量,当前,… 为了能够在不同的单位之间进行转换,我需要特定数量的转换常数. public class PhysicalQuantities
{
protected static Dictionary<string,double> myConvertableUnits;
public static double getConversionFactorToSI(String baseUnit_in)
{
return myConvertableUnits[baseUnit_in];
}
}
public class Length : PhysicalQuantities
{
protected static Dictionary<string,double> myConvertableUnits = new Dictionary<string,double>()
{
{ "in",0.0254 },{ "ft",0.3048 }
};
}
class Program
{
static void Main(string[] args)
{
Length.getConversionFactorToSI("in");
}
}
我认为这给出了一个相当直观的用法,并使代码保持紧凑,可读性和可扩展性.但当然我遇到了引用post描述的相同问题. 现在我的问题是:如何通过设计避免这个问题? 解决方法
我认为这可以用泛型来解决,看起来仍然可读.根据Slaks的建议进行细化,以使注册适合静态构造函数,使其本身具有线程安全性.
所以如果我没有弄错的话: >线程安全(所有工作在静态构造函数中的字典) interface ISIConversionSubscriber
{
void Register(Action<string,double> regitration);
}
static class SIConversion<T> where T : ISIConversionSubscriber,new()
{
private static Dictionary<string,double>();
static SIConversion() {
T subscriber = new T();
subscriber.Register(registrationAction);
}
public static double GetFactor(string baseUnit)
{
return myConvertableUnits[baseUnit];
}
private static void registrationAction(string baseUnit,double value)
{
myConvertableUnits.Add(baseUnit,value);
}
}
abstract class PhysicalQuantities : ISIConversionSubscriber
{
public abstract void Register(Action<string,double> register);
}
class Length : PhysicalQuantities
{
public override void Register(Action<string,double> register)
{
// for each derived type register the type specific values in this override
register("in",1);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(SIConversion<Length>.GetFactor("in"));
}
}
输出:1 如果你想知道为什么我将PhysicalQuantities抽象化:避免将它与SIConversion< PhysicalQuantities> .GetFactor()一起使用,因为我们没有基类的转换.您可能不需要像这样的基类实例 – 它不是数量的完整表示,因此它可能只包含可重用的方法. 另一个建议是使用Enum作为baseUnit而不是字符串.既然每个人都在努力争取类型安全并且在魔术弦上大声吵嚷,那么它可能是一条很好的路径:)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
