gpt4 book ai didi

c# - 如何通过接口(interface)继承在C#中重新定义一个属性?

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:24 25 4
gpt4 key购买 nike

我有一个接口(interface)“IBase”,它指定了一个可为空的 int。后来的接口(interface)“IDerived”隐藏了可为空的 int 并将其“重新定义”为不可为空。

interface IBase
{
int? Redefineable { get; set; }
}

interface IDerived : IBase
{
new int Redefineable { get; set; }
}

实现这些接口(interface)的类必须显式实现隐藏属性,但是它是私有(private)的,因此客户端看不到它。

class TheClass : IDerived
{
public int Redefineable { get; set; }
int? IBase.Redefineable { get; set; }
}

不过,即使是私有(private)属性,我仍然可以通过IBase接口(interface)访问它!

var o = new TheClass();
o.Redefineable = 1; // ok

var hack = o as IBase;
hack.Redefineable = null; // uh!

这似乎违反了 C# 访问修饰符,但无论哪种方式,它都不是我真正想要的重新定义(不仅仅是隐藏)属性。从某种意义上说,它是正确的,它按照您的要求进行操作,获得一个具有可为 null 的 int 的 IBase 接口(interface),但这对于随后可以修改该属性的错误 版本的客户端来说是不直观的。

我真正想要的是,如果客户端访问 IBase.Redefinable,那么它的行为就好像它正在访问 IDerived.Redefinable 属性,即 TheClass 的“真实”属性。这样它实际上被重新定义了,就像通过层次结构返回一样。

class TheClass : IDerived
{
public int Redefineable { get; set; }
int? IBase.Redefineable {
get {
// redirect to redefined property
return this.Redefineable;
}
set
{
// stop client setting it to null
if (!value.HasValue)
throw new InvalidOperationException();

// redirect to redefined property
this.Redefineable = value.Value;
}
}
}

这感觉就像一个 hack,几乎就像我遗漏了什么,所以我想问问是否有人知道实现可重新定义属性的更好/替代方法?

最佳答案

However, even though it's a private property, I can still access it through the IBase interface!

这不是私有(private)属性(property)。它只是一个使用显式接口(interface)实现的属性。这意味着它通过界面公开,但通过界面可用。显式接口(interface)实现主要是为了使“自相矛盾”的接口(interface)实现变得可行,以及用来“劝阻”(但不禁止)某些接口(interface)方法的使用。 不是要给人一种成员根本不存在的印象。

从根本上说,听起来您不应该在这里使用继承 - 如果您不希望某些东西能够充当 IBase,则您不应该从 IBase 继承

关于c# - 如何通过接口(interface)继承在C#中重新定义一个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28155135/

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