如何避免此代码中的静态变量
本文关键字:静态 变量 代码 何避免 | 更新日期: 2023-09-27 18:00:51
我有一个实现IComparable接口的类,但我的CompareTo函数使用了一个静态变量。例如,类看起来像这个
MyClass : IComparable
{
CompareTo(MyClass that)
{
....
double a = SomeOtherClass.staticVariable;
....
}
}
或者这里是真正的代码
SomeOtherClass
{
someMethod()
{
foreach (Vertex v in events)
{
sweepLineX = v.VPoint.X; //sweepLineX is static!!!
...
e1.Key = new MyClass(point1, point2);
// here i create key of MyClass type which is used to store item in BST
}
}
有什么方法可以避免使用那个静态变量吗?我曾想过使用MyClass的字段来保存staticVariable的值,但我将有大约20万个MyClass实例,因此为其存储一个额外的双倍值需要空间。显而易见的解决方案是将其作为参数插入,但我不能,因为CompareTo方法来自接口,而不是我的方法。
您可以应用控制原理的反转。这为您提供了删除MyClass和静态类之间的硬链接的可能性。
1( 将此常量作为参数传递给方法。
MyClass : IComparable
{
CompareTo(MyClass that, double yourConstant)
{
....
double a = yourConstant;
....
}
}
2( 将此变量作为Property传递。MyClass:IComparable{双YourConstant{get;set;}
CompareTo(MyClass that)
{
....
double a = YourConstant;
....
}
}
3( 将此变量作为构造函数参数传递。
MyClass : IComparable
{
public MyClass(double constant)
{
_yourConstant = constant;
}
private double _yourConstant;
CompareTo(MyClass that)
{
....
double a = _yourConstant;
....
}
}
为什么不创建一个接口呢。
IComparable
只是一个与的接口
int CompareTo(object obj);
返回CCD_ 2。
只需创建一个具有此功能的IMyComparable
int CompareTo(object obj, int someThingExternal)
从IMyComparable
派生您的类
或
如果你不介意牺牲一些遗产的话。假设MyClass
不需要从任何其他类派生。
abstract class MyCompare : IComparable
{
int CompareTo(Object that)
{
return CompareTo(that, YOURSTATICVARIABLE);
}
abstract int CompareTo(Object that, int somethingExternal);
}
从MyCompare
派生您的类。
MyClass : MyCompare