今天我面临一个非常奇怪的面试问题。面试官问我: -
有一个类Parent,它有一个方法GetData
。类Child1继承Parent,Child2继承Child1。你可以在Parent类中做什么,以便可以从Child1访问方法“GetData”,但不能从Child2访问?
答案 0 :(得分:2)
有点奇怪的设置,但是这里有另一个选项,因为嵌套类可以访问外部类的私有成员:
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
}
}
答案 1 :(得分:2)
父类可以将它的方法标记为私有,然后在其内部声明第一个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();
}
}
答案 2 :(得分:1)
如果我们假设在程序集A中存在Parent和Child1而程序集B中存在Child2,并且程序集A在程序集B引用程序集A时没有将其内部公开给程序集B,则可以将GetData标记为内部,此时它可以被Child1访问,但不能访问Child2。
这里的副作用是它对整个组件都是可见的。
请注意,受保护的内部会产生相反的效果 - 它会使getData对child2可见,因为受保护的内部是明确的"受保护的或内部的"根据{{3}}