Nat*_*Nat 7 c# getter setter overriding readonly
更新: 此问题已经过修改,以使其更加清晰.下面的答案似乎反映出这种方法效果很好.希望这个问题可以帮助那些需要添加get或者添加set现有财产的人.
今天遇到一个问题,我需要get用a get和覆盖基类的-only属性set.目前的共识似乎是这是不可能的,但我认为我找到了一种方法.
一般的想法是创建一个new属性而不是直接override使用旧属性,然后我们通过调用新方法创建一个override旧get方法的桥接方法.
这是一些无法修改的任意预先存在的类型结构的代码.
public abstract class A
{
public abstract int X { get; }
}
public class B : A
{
public override int X { get { return 0; } }
}
Run Code Online (Sandbox Code Playgroud)
我们想编写这段代码,但不会编译.
public class C : B // won't compile: X can't have a 'set' method
{
private int _x;
public override int X { get { return _x; } set { _x = value; } }
}
Run Code Online (Sandbox Code Playgroud)
我们无论如何都要编写我们想要的代码,但我们声明属性new代替override,允许我们声明一个set方法.
public class D : C // Same thing, but will compile because X is 'new'
{
private int _x;
public new virtual int X { get { return this._x; } set { this._x = value; } } // also 'virtual', unless we want to 'sealed' it.
// Bridge method provides the override functionality:
protected sealed override int XGetter { get { return this.X; } } // 'sealed' because this bridge should always refer to the new 'get' method
}
Run Code Online (Sandbox Code Playgroud)
额外的桥接方法XGetter提供了override.这是使用中间层粘贴到基类结构:
public abstract class C : B //abstract intermediate layer
{
// Override-and-seal the base property's getter.
public sealed override int X { get { return this.XGetter; } }
// Define the bridge property for the new class to override.
protected abstract int XGetter { get; }
}
Run Code Online (Sandbox Code Playgroud)
我认为D现在它等同于继承的类,B同时也能够在setter中重写.它是否正确?
请小心您的解决方案,因为它隐藏了 A 和 B 的原始意图。话虽这么说,您的解决方案确实有效,即使在转换为基类时也是如此。
例子:
D d = new D();
d.X = 2;
B b = d as B;
Assert.AreEqual(2, b.X);
Run Code Online (Sandbox Code Playgroud)
如果可以修改基类,我建议使用反射。
| 归档时间: |
|
| 查看次数: |
5089 次 |
| 最近记录: |