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

How to redefine a property in C# through interface inheritance?

我有一个接口 'IBase',它指定了一个可为 null 的 int。后来的接口 'IDerived' 隐藏了可为空的 int 并且 'redefines' 将其隐藏为不可为空的。

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

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

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

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

但是,即使它是私有的属性,我仍然可以通过IBase 接口访问它!

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

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

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

我真正想要的是,如果客户端访问 IBase.Redefinable,那么它的行为就好像它正在访问 IDerived.Redefinable 属性、'real' 属性 的 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,几乎就像我遗漏了什么,所以我想问一下是否有人知道 better/alternative 实现可重新定义属性的方法?

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

这不是私人 属性。它只是一个 属性 使用显式接口实现。这意味着它是 public 通过界面,但 只有 通过界面可用。显式接口实现主要是为了"contradictory"接口的实现变得可行,以及用于"discourage"(但不禁止)某些接口方法的使用。 不是是为了给人一种成员根本不存在的印象。

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