【问题标题】:More specific property type through new keyword sanity check通过新的关键字完整性检查更具体的属性类型
【发布时间】:2021-03-04 11:51:25
【问题描述】:

我有一个与this user 类似的问题,但是我发现使用泛型会在实际使用中引入不必要的冗长。

(在我的例子中,“MySpecificClass”使用一种特定的 ICustom Values 类型,因此 T 始终只是一种类型。)

我当前的“解决方案”是在基类中定义一个支持成员,然后在派生类中定义转换为更具体类型的“新”属性。

public class BaseMember { }

public class BaseOwner
{
    protected BaseMember _member;
    public BaseMember member {get => _member; private set => _member = value;}
}

public class DerivedMember: BaseMember { }

public class DerivedOwner : BaseOwner
{
    public new DerivedMember member {get => (DerivedMember) _member; private set => _member = value;}
}

这感觉很聪明,到目前为止还没有引起任何问题。在编写派生这些类的更高级别代码方面,它还产生了我正在寻找的确切交互。

它看起来也像一个巨大的定时炸弹,虽然我不能指望它。我错过了什么?

【问题讨论】:

  • 方法隐藏的副作用解释见this answer
  • 虽然当前接受的答案是在较新的 c# 版本中处理这种情况的正确方法,但这个链接实际上为我提供了我正在寻找的信息。看起来我很安全(在我的用例中)。

标签: c# polymorphism


【解决方案1】:

C# 9.0 允许更改返回类型,使用更具体的类。所以你不需要new。见Covariant returns

要使用它,您需要在基类中将其声明为 virtual,然后在子类中声明为 override

【讨论】:

  • 当。这正是我想要的,没有奇怪的铸造访问器。很遗憾我的应用程序由于原因(tm)而被 7.3 卡住了。
  • @ThaHypnotoad:“因为原因”。我知道!真可惜。祝你好运与利益相关者合作,说服他们不要被困在过去。
猜你喜欢
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多