1

我对 C# 有点陌生,我已经取得了一些让我感到困惑的东西,为什么允许这样做。

public interface IBase
{
}

public interface ISub : IBase
{
}

public class Thing
{
    protected IBase provider;

    public Thing(IBase provider)
    {
        this.provider = provider;
    }
}

public class AnotherThing : Thing
{
    protected ISub provider;

    public AnotherThing(ISub provider) : base(provider)
    {
        this.provider = provider;
    }
}

我希望我只是很密集,但我不明白如何允许我覆盖provider而不会给编译器造成一些混乱。

该代码确实有效。

4

3 回答 3

3

我很惊讶你也没有收到任何警告。

您正在做的是通过在派生类中为其提供新声明来隐藏受保护的成员。provider这是允许的,但您应该使用new关键字装饰声明,以使其更明确地表明您打算隐藏该成员,而这不仅仅是意外/疏忽。

于 2013-09-24T14:59:52.397 回答
1

你问我假设的第二种情况:你没有覆盖任何东西,你只是声明一个新的受保护变量并明确引用它this

this.provider = provider;

由于 provider 参数的类型ISub与 相同this.provider,编译器知道您的确切含义是什么变量。

于 2013-09-24T15:00:03.423 回答
0

您应该会收到一条警告,表明providerinAnotherThing正在隐藏一个继承的成员。

实际上发生的事情是编译器providerThing上下文中忽略AnotherThing- 它被称为名称隐藏

于 2013-09-24T15:01:18.523 回答