我已经创建了A,B和C三个类。
但是,我不明白为什么从集合中继承时,派生类只能访问仅基类的受保护成员。
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++;
}
}
答案 0 :(得分:0)
如注释中所述,您实际上并不是从A
继承。您是从Collection<T>
继承的。
如果您的目标是公开protected
的{{1}}属性,则创建一个继承自A
的类,并使A
属性的名称与刚刚修改的相同继承类的属性。然后收集该新类。
类似这样的事情。注意新的类public
:
D
new
修饰符关键字表示您正在替换继承类型的属性。
答案 1 :(得分:0)
首先,也许与您的问题并不严格相关,我不确定为什么C
有一个成员MyC
。键入C
是是Collection<A>
,这样您就可以使用索引器this[int x]
来访问收集项。
要授予C
对A
的所有成员的访问权限,同时仍然限制对其他任何对象的访问,可以将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!
}
}
}
请注意,这使C
对A
的访问权限超出了您的预期(所有成员都与访问修饰符无关)。
这里有一些关于嵌套类的优缺点的讨论:What are reasons why one would want to use nested classes?