2011-10-16 54 views
3
  • 我有一個是從B.
    • 甲繼承作爲我想從修改一些只讀屬性的類甲B
    • 用new隱藏這些屬性不是一個合適的選項,導致基類有一些函數使用它自己的屬性...
    • 無法使用override關鍵字,導致屬性未標記爲抽象,虛擬也沒有凌駕

所以我想知道是否從繼承類(B)我可以完全重新創建我的對象的實際實例來訪問這些只讀屬性。類繼承:重新從繼承的類的屬性的基類的項目(或實例)

例如,併爲更好的解釋,對於一個類繼承元組,如果有可能,我會做這樣的事情:

public new T3 Item3 
    { 
     get { return item3; } 
     set 
     { 
      item3 = value; 
      base = new Tuple<T1, T2, T3>(Item1, Item2, Item3); // Not valid 
     } 
    } 

我看不出如何做到這一點?

+0

您發佈的內容越多,您希望'Tuple <>'看起來越少,您似乎就越想要一個真正的類來模擬您的域。 –

+0

也許我誤解了一個元組是什麼,但我只想要一個具有與元組相同行爲的類,除了我希望屬性可以改變。我發佈這個新問題是因爲它讓我覺得這是一個更簡單的解決方案,而不是實現我所談論的接口 – GianT971

+0

如果你可以創建一個描述你所遇到的問題的_short_問題,我想你會得到更好的答案試圖建模,而不是一些機械問題關於做一個非常具體的(看起來很尷尬)的方式 –

回答

5

元組是不可變的,所以你不能改變它的值。當你有不可變的對象時,改變它們的方法是返回一個新的對象,並且改變所需的屬性。所以,如果你想堅持的元組,你可以做這樣的事情:

public static class TupleExtensions { 
    public static Tuple<T1, T2, T3> 
    WhereItem3Is<T1, T2, T3>(this Tuple<T1, T2, T3> self, T3 newValue) { 
    return Tuple.Create(self.Item1, self.Item2, newValue); 
    } 
    // other methods for Tuple<,,> or other Tuples... 
} 

而且使用這樣的:

var t = Tuple.Create(1, 2, 3); 
// ... 
t = t.WhereItem3Is(4); 

但它的痛苦寫所有這些方法一點點。所以,如果你需要很多的,更好的只是這樣做:

var t = Tuple.Create(1, 2, 3); 
t = Tuple.Create(t1.Item1, t1.Item2, 4); 

你甚至可以有你會使用引用來自不同地方的元組在你的代碼的包裝類型,所以,任何「改變」可能可見:

var t = Tuple.Create(1, 2, 3); 
var r = new Ref<Tuple<int, int, int>>(t); 
// share r ... 
r.Value = Tuple.Create(r.Value.Item1, r.Value.Item2, 4); 

... 

public class Ref<T> { 
    public T Value { get; set; } 
    public Ref(T value) { Value = value; } 
} 

所有這一切,雖然感覺很彆扭。也許你可以更好地解釋你所遇到的必不可少的問題,這樣可以提供更好的答案。也許你真的不需要元組,只是更具體到你的域。

+0

所以我想我想做什麼(問題的標題寫什麼)是不可能的 – GianT971

+0

是的,這是不可能的 –