gpt4 book ai didi

c# - 如何制作部分虚拟属性(property)?

转载 作者:行者123 更新时间:2023-12-04 14:51:47 25 4
gpt4 key购买 nike

设计——完美世界

我有一个具有属性 Value 的抽象基类 A,以及两个派生类 W 和 R。始终可以读取 Value(并且方法始终相同——读取存储的值),所以我会将 getter 直接放入 A .

然而,写入 Value 并不总是可能的,因此有 W 和 R。W 还提供了一个 setter,而 R 没有——它只是依赖于来自 A 的特性。

问题是,无论我如何尝试,我都无法在 C# 中实现这样的设计。我无法覆盖 W 中的 Value 属性,因为基类中没有 setter (也没有,因为向基类添加 setter 意味着它也会“泄漏”到 R )。

现实——丑陋的解决方法(不要阅读)

我在 A 中添加了一个引发异常的 setter 。在 W 中,我覆盖了 setter,而在 R 中,我什么也不做。

这很难看,因为设计,因为 R 中的 setter 是公共(public)的,因为现在这样的代码可以编译:

R reader;
reader.Value = 5;

问题

那么如何在基类中创建一个只有getter的属性,并在派生类中添加一个setter呢?

故事

因为总是至少有一个好奇的灵魂,我解释说——那些类是数据持有者/管理者。 R 类是动态数据“持有者”——它使用给定的公式计算值(类似于 Lazy Eval 类)。大多数东西在 W 和 R 中是通用的——过滤值、发送通知等等。唯一的区别是在 R 中你不能直接设置值,因为公式是单向的(类似于 WPF 转换器,只定义了一种方法,转换)。

解决方案

感谢 Marc 我解决了这个问题,这里是代码:
  abstract class A {
public int Value { get { return ... } }
}

class R : A { }

class W : A {
new public int Value {
get { return base.Value; }
set { .... }
}
}

与 Marc 版本的不同之处在于基类中缺少 setter(这是问题的重点),与我的解决方法的不同之处在于隐藏属性,而不是覆盖它。小而关键的一 block 。

谢谢马克的启发:-)。

最佳答案

abstract class A {
public int Value {get; protected set;}
}
class R : A { }
class W : A {
new public int Value {
get { return base.Value; }
set { base.Value = value; }
}
}

关于c# - 如何制作部分虚拟属性(property)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4447967/

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