如何避免此代码中的静态变量

本文关键字:静态 变量 代码 何避免 | 更新日期: 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