为什么从Collection <t>继承会更改可访问性级别?

时间:2018-11-11 21:18:19

标签: c# inheritance

我已经创建了A,B和C三个类。

  • B继承自A
  • C继承了A的集合

但是,我不明白为什么从集合中继承时,派生类只能访问基类的受保护成员。

public class A
{
    public int MyPublic { get; set; }
    protected int MyProtected { get; set; }
    internal int MyInternal { get; set; }
    protected internal int MyProtectedInternal { get; set; }
}
public class B : A
{
    B MyB { get; set; }
    B()
    {
        MyB.MyProtected++;
        MyB.MyInternal++;
        MyB.MyPublic++;
        MyB.MyProtectedInternal++;
    }
}
public class C : Collection<A>
{
    C MyC { get; set; }
    C()
    {
        MyC[0].MyProtected++; // Inaccessible due to its protection level.
        MyC[0].MyInternal++;
        MyC[0].MyPublic++;
        MyC[0].MyProtectedInternal++;
    }
}

2 个答案:

答案 0 :(得分:0)

如注释中所述,您实际上并不是从A继承。您是从Collection<T>继承的。

如果您的目标是公开protected的{​​{1}}属性,则创建一个继承自A的类,并使A属性的名称与刚刚修改的相同继承类的属性。然后收集该新类。

类似这样的事情。注意新的类public

D

new修饰符关键字表示您正在替换继承类型的属性。

答案 1 :(得分:0)

首先,也许与您的问题并不严格相关,我不确定为什么C有一个成员MyC。键入C Collection<A>,这样您就可以使用索引器this[int x]来访问收集项。

要授予CA的所有成员的访问权限,同时仍然限制对其他任何对象的访问,可以将C设为嵌套类型。

public class A
{
    protected int MyProtected { get; set; }
    private int MyPrivate { get; set; }

    public class C : Collection<A>
    {
        public void Foo()
        {
            this[0].MyProtected++; // Allowed
            this[0].MyPrivate++; // Also allowed!
        }
    }
}

请注意,这使CA的访问权限超出了您的预期(所有成员都与访问修饰符无关)。

这里有一些关于嵌套类的优缺点的讨论:What are reasons why one would want to use nested classes?