簡體   English   中英

更新基類值,以便所有派生類也更新

[英]Update Base class values so all derived classes are also updated

我希望減少我正在工作的東西的內存需求,並且遇到了一些派生類的問題。 目前我有 4 個繼承相同基類並覆蓋相同方法的派生類,但是每個派生類的覆蓋方法中的函數是不同的。 這有助於清理大量代碼並使維護更容易。 然而,每個派生類都有一個long[,] File_Vals全局變量,它變得非常大。 以下是課程的設置方式。

        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必須更新。 有沒有辦法只需要更新父類/基類,從而更新其他派生類/子類? 或者有沒有辦法讓每個派生/子類沒有自己的File_values對象版本,並且只有一個他們都可以訪問? 現在File_values對象可以包含 1200 萬行或更多行,因此需要考慮內存使用情況。

有了這個,有 4 組 File_values 必須更新

不,在您的問題代碼中,只有一個long[,]共享實例(因為數組是引用類型)和 4 個對它的引用。 您可以使用下一個代碼輕松檢查它:

Setup(new long[1,1], 1);
Console.WriteLine(object.ReferenceEquals(firstDerived.File_Vals, secondDerived.File_Vals)); // prints True 

所以基本上你有32*464*4位的“開銷”取決於平台。

您可以將File_Vals字段設置為readonly ,以防止為其分配另一個值(引用),或者更好的 get-only 屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM