类继承:从继承类的属性中重新创建基类项(或实例)

5
  • 我有一个从B继承的A类。
    • A有一些只读属性,我想从B中修改它们
    • 使用new隐藏这些属性不是一个合适的选择,因为基类有一些使用自己属性的函数...
    • 不能使用override关键字,因为这些属性没有被标记为abstract、virtual或override

所以我想知道是否可以从继承的类(B)完全重新创建我的对象实例以访问这些只读属性。

例如,对于继承Tuple的类,如果可能的话,我会做这样的事情:

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

我不知道如何做到这一点?


你发布的越多,似乎你越不需要一个 Tuple<>,而是更需要一个真正模拟你领域的类。 - Ritch Melton
也许我误解了Tuple的含义,但我只想要一个具有与Tuple相同行为的类,只是我希望属性可以被更改。我发布这个新问题,因为它在我的脑海中成为一个更容易的解决方案,而不是实现我所谈论的接口。 - GianT971
如果您能创建一个简短的问题来描述您试图建模的问题,而不是一些关于以非常特定(看起来很笨拙)的方式执行某些机械问题的问题,我认为您会得到更好的答案。 - Ritch Melton
1个回答

7

元组是不可变的,因此您无法更改其值。当您拥有不可变对象时,更改它们的方法是返回一个新对象,其中所需属性已更改。因此,如果您想坚持使用元组,则可以执行以下操作:

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; } 
}

然而,所有这些感觉非常的尴尬。也许您可以更好地解释您所遇到的根本问题,以便能够提供更好的答案。也许您并不需要元组,只需要使用针对您领域更具体的东西。


所以我想做的事情(问题标题中写的)是不可能的。 - GianT971

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接