【问题标题】:Class inheritance: recreate base class items (or instance) from a property of the inherited class类继承:从继承类的属性重新创建基类项(或实例)
【发布时间】:2011-12-08 22:36:34
【问题描述】:
  • 我有一个继承自 B 的 A 类。
    • A 作为我想从 B 修改的一些只读属性
    • 用 new 隐藏这些属性不是一个合适的选择,因为基类有一些使用自己的属性的函数...
    • 无法使用 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&lt;&gt;,而您似乎越想要一个模拟您的域的真实类。
  • 也许我误解了元组是什么,但我只想要一个与元组具有相同行为的类,除了我希望属性是可变的。我发布这个新问题是因为我想到了一个更简单的解决方案,而不是实现我谈到的接口
  • 我认为,如果您可以创建一个 short 问题来描述您尝试建模的问题,而不是一些关于做某事的机械问题,那么您会得到更好的答案特定(且看似尴尬)的方式

标签: c# class inheritance properties overriding


【解决方案1】:

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

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

不过,这一切都让人感觉非常尴尬。也许您可以更好地解释您遇到的基本问题,以便提供更好的答案。也许你真的不需要元组,只需要更特定于你的域的东西。

【讨论】:

  • 所以我想我想做的(问题标题中写的)是不可能的
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多