gpt4 book ai didi

c# - 类继承 : recreate base class items (or instance) from a property of the inherited class

转载 作者:太空狗 更新时间:2023-10-29 23:02:16 26 4
gpt4 key购买 nike

  • 我有一个继承自 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
}
}

我不知道该怎么做?

最佳答案

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

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

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

关于c# - 类继承 : recreate base class items (or instance) from a property of the inherited class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com