更新基本 class 值,以便所有派生的 class 值也得到更新
Update Base class values so all derived classes are also updated
我希望减少我正在从事的工作的内存需求,并且 运行 解决一些派生的 classes 的问题。目前我有 4 个派生 class 继承相同的基础 class 并重写相同的方法,但是重写方法中的函数对于每个派生 class 是不同的。这有助于清理大量代码并使维护更加容易。然而,每个派生的 class 都有一个 long[,] File_Vals
全局变量,它变得非常大。以下是 classes 的设置方式。
public class BaseClass {
public long[,] File_Vals;
public int Max_rows;
internal void DoWork(){}
}
public class FirstDerivedClass : BaseClass
{
public DerivedClass(long[,] file_values, int max_rows)
{
File_Vals = file_values;
Max_rows = max_rows
}
internal new void DoWork()
{
// does work stuff
}
}
public class SecondDerivedClass : BaseClass
...
public class Testing
{
FirstDerivedClass firstDerived;
SecondDerivedClass secondDerived;
ThirdDerivedClass thirdDerived;
FourthDerivedClass fourthDerived;
public void Setup(long[,] file_values, int max_rows)
{
firstDerived = new FirstDerivedClass(file_values, max_rows);
secondDerived = new SecondDerivedClass(file_values, max_rows);
thirdDerived = new ThirdDerivedClass(file_values, max_rows);
fourthDerived = new FourthDerivedClass(file_values, max_rows);
}
...
public void DoStuff(long[,] file_values, int max_rows)
{
// updated versions of file_values and max_rows.
}
}
因此有 4 组 File_values
必须更新。有没有办法只更新 parent/Base class 从而更新其他 derived/child classes?或者有没有一种方法可以让每个 derived/child classes 都没有自己的 File_values
对象版本,并且只有其中一个是他们都可以访问的?现在 File_values
对象可以有 1200 万行,或者更多,所以内存使用是需要考虑的事情。
with this there are 4 sets of File_values that have to be updated
不,在您的问题代码中,只有一个 long[,]
的共享实例(因为数组是 reference types)和 4 个对它的引用。您可以使用下一个代码轻松检查它:
Setup(new long[1,1], 1);
Console.WriteLine(object.ReferenceEquals(firstDerived.File_Vals, secondDerived.File_Vals)); // prints True
所以基本上你有 32*4
或 64*4
位“开销”取决于平台。
您可以使 File_Vals
字段 readonly
,以防止它被分配另一个值(参考),或者,更好的是 get-only 属性.
我希望减少我正在从事的工作的内存需求,并且 运行 解决一些派生的 classes 的问题。目前我有 4 个派生 class 继承相同的基础 class 并重写相同的方法,但是重写方法中的函数对于每个派生 class 是不同的。这有助于清理大量代码并使维护更加容易。然而,每个派生的 class 都有一个 long[,] File_Vals
全局变量,它变得非常大。以下是 classes 的设置方式。
public class BaseClass {
public long[,] File_Vals;
public int Max_rows;
internal void DoWork(){}
}
public class FirstDerivedClass : BaseClass
{
public DerivedClass(long[,] file_values, int max_rows)
{
File_Vals = file_values;
Max_rows = max_rows
}
internal new void DoWork()
{
// does work stuff
}
}
public class SecondDerivedClass : BaseClass
...
public class Testing
{
FirstDerivedClass firstDerived;
SecondDerivedClass secondDerived;
ThirdDerivedClass thirdDerived;
FourthDerivedClass fourthDerived;
public void Setup(long[,] file_values, int max_rows)
{
firstDerived = new FirstDerivedClass(file_values, max_rows);
secondDerived = new SecondDerivedClass(file_values, max_rows);
thirdDerived = new ThirdDerivedClass(file_values, max_rows);
fourthDerived = new FourthDerivedClass(file_values, max_rows);
}
...
public void DoStuff(long[,] file_values, int max_rows)
{
// updated versions of file_values and max_rows.
}
}
因此有 4 组 File_values
必须更新。有没有办法只更新 parent/Base class 从而更新其他 derived/child classes?或者有没有一种方法可以让每个 derived/child classes 都没有自己的 File_values
对象版本,并且只有其中一个是他们都可以访问的?现在 File_values
对象可以有 1200 万行,或者更多,所以内存使用是需要考虑的事情。
with this there are 4 sets of File_values that have to be updated
不,在您的问题代码中,只有一个 long[,]
的共享实例(因为数组是 reference types)和 4 个对它的引用。您可以使用下一个代码轻松检查它:
Setup(new long[1,1], 1);
Console.WriteLine(object.ReferenceEquals(firstDerived.File_Vals, secondDerived.File_Vals)); // prints True
所以基本上你有 32*4
或 64*4
位“开销”取决于平台。
您可以使 File_Vals
字段 readonly
,以防止它被分配另一个值(参考),或者,更好的是 get-only 属性.