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

标签 c# properties interface redefine explicit-interface

我有一个接口(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/

相关文章:

python - 使用 @property 与 getter 和 setter

C# 如何在 get 属性中使用模板?

javascript - AngularJS $资源参数名称

c# - 我们可以在 C# 中使用接口(interface)实现多态性吗?

c# - 在 C# 中实现 Retry Wrapper 的最佳方法是什么?

c# - IdentityServer 4,试图用 fiddler 捕获流量?

C# 使用文件/字节

c# - MvcSiteMapProvider - 增强的 Bootstrap 下拉菜单

java - java中字符串的字体设置

delphi - 作为事件处理程序的接口(interface)方法