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

本文关键字:继承 创建 实例 基类 新创建 属性 | 更新日期: 2023-09-27 18:11:30

  • 我有一个继承自B的类a。
    • A是我想从B修改的一些只读属性
    • 用new隐藏这些属性不是一个合适的选项,因为基类有一些函数使用自己的属性
    • 无法使用override关键字,因为属性未标记为抽象、虚拟或override

因此,我想知道从继承的类(B(中,我是否可以完全重新创建我的对象的实际实例来访问那些只读属性。

例如,为了更好地解释,对于继承Tuple的类,如果可能的话,我会这样做:

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

我不知道该怎么做?

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

元组是不可变的,因此不能更改其值。当您有不可变的对象时,更改它们的方法是返回一个具有更改后的所需属性的新对象。所以,如果你想坚持使用元组,你可以这样做:

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

然而,所有这些都让人感到非常尴尬。也许你可以更好地解释你遇到的基本问题,以便提供更好的答案。也许你根本不需要元组,只需要更特定于你的域的东西。