我正在研究一種情況,我希望有一個基類,它定義了一個靜態關聯數組和靜態函數,然後在它繼承的類中複製這個功能,但是與每個孩子類擁有自己的數組實例。看起來像子類只是繼承了父類的數組,而不是像我期望的那樣創建自己的靜態副本。下面是什麼我所希望實現超簡化的簡化版:D:繼承靜態變量,按類別區分?
class MyBase {
static string[string] dict;
static void attach(string key, string val) {
dict[key] = val;
}
}
class MySubA : MyBase {
// various unique member variables
}
class MySubB : MyBase {
// ...
}
void main() {
MySubA.attach("a", "a1");
MySubB.attach("b", "b1");
writefln("-:%s", MyBase.dict);
writefln("A:%s", MySubA.dict);
writefln("B:%s", MySubB.dict);
}
所需的輸出:
-:[]
A:["a":"a1"]
B:["b":"b1"]
實際輸出:
-:["a":"a1", "b":"b1"]
A:["a":"a1", "b":"b1"]
B:["a":"a1", "b":"b1"]
是否有辦法在這種情況下不要拋棄繼承,只需複製每個子類的相關代碼?分配給我正在使用的數組的實際代碼比上面列出的附加函數更復雜,因此我希望避免每次都複製它,或者在必要時手動分配給.dict。我想知道是否有解決方案涉及模板可能工作,但我似乎無法將它拼湊在一起。
就這麼你知道,'MySubA'和'MySubB'不以這種方式共享相同的基類。它們處於完全獨立的類層次結構中,因爲「MyBase!MySubA」和「MyBase!MySubB」是不同的類。同一個模板的不同實例是完全獨立的實體,彼此之間沒有任何關係。 – 2012-07-17 04:58:10
如果實際上並不需要類層次結構(並且僅用於提供字典實現),那麼我會說模板mixin就是要走的路。 – 2012-07-18 10:03:26
+1肯定。@ccjuju,如果你只是使用繼承來避免一點重複,那麼不要使用泛型。另一方面,如果這些類代表一個對象層次結構,那麼你發佈的解決方案就不會按照你的要求去做。 – Tim 2012-07-18 17:18:54