从子类的子类访问父成员
本文关键字:子类 父成员 访问 | 更新日期: 2023-09-27 18:04:54
今天我遇到了一个非常奇怪的面试问题。面试官问我:-
有一个类Parent,它有一个方法GetData
。类Child1继承Parent,类Child2继承类Child1。你可以在父类做什么,使方法"GetData"将从Child1访问,但不能从Child2?
设置有点奇怪,但这里有另一个可行的选项,因为嵌套类可以访问外部类的私有成员:
public class Parent
{
public Parent()
{
GetData();
}
private void GetData()
{
}
public class Child1 : Parent
{
public Child1()
{
GetData();
}
}
}
class Child2 : Parent.Child1
{
public Child2()
{
GetData(); //compiler error, inaccessible due to protection level
}
}
父类可以将自己的方法标记为private,然后在自己的声明中声明第一个Child。
public class Job
{
private void Test()
{
}
public class JobChild : Job
{
public JobChild()
{
//works
this.Test();
}
}
}
public class JobChildTwo : Job.JobChild
{
public JobChildTwo()
{
//doesn't work
this.Test();
}
}
如果我们假设Parent和Child1存在于汇编A中,而Child2存在于汇编B中,并且汇编A不向汇编B公开其内部,而汇编B引用汇编A,那么你可以将GetData标记为内部,此时它将被Child1访问而不是Child2。
这里的副作用是整个程序集都可以看到。
注意protected internal会产生相反的效果——它会使GetData对child2可见,因为根据MSDN