我有一个实现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的值,但我会有大约200k的MyClass实例,所以需要空间来为它存储一个额外的double值。 显而易见的解决方案是将其作为参数插入,但我不能,因为CompareTo方法来自接口,而不是我的方法。
答案 0 :(得分:0)
您可以应用Inversion of control原则。这提供了删除MyClass和静态类之间的硬链接的可能性。
1)将此常量传递给方法作为参数。(它不是更好)
MyClass : IComparable
{
CompareTo(MyClass that, double yourConstant)
{
....
double a = yourConstant;
....
}
}
2)将此变量作为Property传递。 MyClass:IComparable { double YourConstant {get;设置;}
CompareTo(MyClass that)
{
....
double a = YourConstant;
....
}
}
3)将此变量作为构造函数参数传递。
MyClass : IComparable
{
public MyClass(double constant)
{
_yourConstant = constant;
}
private double _yourConstant;
CompareTo(MyClass that)
{
....
double a = _yourConstant;
....
}
}
答案 1 :(得分:0)
为什么不创建一个界面。
IComparable
只是一个带
int CompareTo(object obj);
返回0, -1, 1
。
只需使用此功能创建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