答案 0 :(得分:0)
我没有达到目的,但您是否考虑过让ClassB
通用?这样的事情:
public class ClassB<T>
{
private static ClassA if_rect_Changed = new ClassA();
public static void MethodB(Rect yourRect)
{
if (if_rect_Changed.RectChanged(yourRect))
{
Debug.Log("Changes were made");
}
}
}
并按照它使用它:ClassB<ClassC>.MethodB(rect)
所以每个班级都会拥有“更改跟踪器”的“副本”,您将能够保持MethodB
静态。
答案 1 :(得分:0)
为什么不跳过静态类B,只在类C和D中创建类A的静态属性。你编写代码的方式似乎搞砸了。我要处理的另一种方法是做类似的事情:
public class ClassA
{
protected Rect storedRect;
public ClassA() { }
public virtual void UpdateEverFrame();
protected bool IsRectChanged(Rect rect)
{
bool isChanged = !rect.Equals(StoredRect);
if(isChanged)
{
storedRect = rect;
}
return isChanged;
}
}
public class ClassC : ClassA
{
public override void UpdateEverFrame()
{
if(IsRectChanged(new Rect(0, 0, 20, 20)))
{
Debug.Log("Changes were made class C");
}
}
}
public class ClassD : ClassA
{
public override void UpdateEverFrame()
{
if(IsRectChanged(new Rect(100, 100, 10, 10)))
{
Debug.Log("Changes were made class D");
}
}
}
答案 2 :(得分:0)
首先澄清一些。我假设您正在使用System.Windows.Rect,对吗?更多澄清......
我们在ClassB中有ClassA的静态属性,名为 isRectChanged
不,您在ClassB中有一个类型为ClassA的静态字段,名为 RectHelper 。 IsRectChanged 是ClassA的非静态方法。
我们希望在相同主题上运行的其他静态方法中访问静态属性的值。
由于它们位于相同的线程,因此您无法同时调用静态方法。到目前为止,没问题。
他们都调用 ClassB.MethodB 并覆盖 MethodB的Rect parmeter 的值。这两个类都使用相同的
实例ClassB.MethodB
...
他们没有覆盖 Rect 参数,而是提供 Rect 对象。 ClassB 是实例,而不是ClassB.MethodB
。
......永远都是真的。
不是那么,请尝试运行下面的代码,您会看到只有第一个调用返回 true 。
ClassC c = new ClassC();
c.UpdateEverFrame();
c.UpdateEverFrame();
c.UpdateEverFrame();
但如果你在行之间通过 ClassD 插入来电,是的,IsRectChanged
会返回 true ,因为它是真的, Rect 强>实际上是不同的。但是,这就是静态的用途,即 Singleton 类型操作。
如果你想要一个每个类静态变量,那么在每个类中放一个静态变量。如果这需要您复制代码,请使用模板。它不一定要花哨,例如,只需更改 ClassB 以及调用 ClassB 的方法,如下所示......
public class ClassB<TClass> // the rest of the class is the same
...
/* in ClassC */ ClassB<ClassC>.MethodB(new Rect(...));
...
/* in ClassD */ ClassB<ClassD>.MethodB(new Rect(...));
通过将 ClassB 添加到模板中,每个ClassB&lt;&gt;是一个不同的静态对象,每个对象都有自己的静态变量副本。现在,以下代码将为 ClassC 和 ClassD 上的第一次调用返回 false 。
ClassC c = new ClassC();
c.UpdateEverFrame();
c.UpdateEverFrame();
c.UpdateEverFrame();
ClassD d = new ClassD();
d.UpdateEverFrame();
d.UpdateEverFrame();
c.UpdateEverFrame();
d.UpdateEverFrame();
以下是课程......
public static class ClassB<TClass>
{
private static ClassA RectHelper = new ClassA();
public static void MethodB(Rect yourRect)
{
if (RectHelper.IsRectChanged(yourRect))
{
Debug.WriteLine("Changes were made");
}
}
}
public class ClassC
{
public void UpdateEverFrame()
{
ClassB<ClassC>.MethodB(new Rect(0, 0, 20, 20));
}
}
public class ClassD
{
public void UpdateEverFrame()
{
ClassB<ClassD>.MethodB(new Rect(100, 100, 10, 10));
}
}