Java 从子类的子类访问父成员
今天我面临一个非常奇怪的面试问题。面试官问我:-Java 从子类的子类访问父成员,java,c#,c++,.net,Java,C#,C++,.net,今天我面临一个非常奇怪的面试问题。面试官问我:- 有一个类父类,它有一个方法GetData。类Child1继承父类,Child2继承Child1。您可以在父类中执行哪些操作,以使方法“GetData”可以从Child1而不是Child2访问?如果我们假设父类和Child1存在于程序集A中,而Child2存在于程序集B中,并且程序集A在程序集B引用程序集A时不向程序集B公开其内部,则可以将GetData标记为内部,此时,Child1可以访问,但Child2不能访问 这里的副作用是整个组件都可以看到
有一个类父类,它有一个方法
GetData
。类Child1继承父类,Child2继承Child1。您可以在父类中执行哪些操作,以使方法“GetData”可以从Child1而不是Child2访问?如果我们假设父类和Child1存在于程序集A中,而Child2存在于程序集B中,并且程序集A在程序集B引用程序集A时不向程序集B公开其内部,则可以将GetData标记为内部,此时,Child1可以访问,但Child2不能访问
这里的副作用是整个组件都可以看到它
请注意,受保护的internal将产生相反的效果-它将使GetData对child2可见,因为受保护的internal根据某种奇怪的设置显式地“受保护或内部”,但这里有另一个选项,因为嵌套类可以访问外部类的私有成员:
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,然后在其自己的声明中声明第一个子类
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();
}
}
我尝试了一些“明显”的方法,但它们要么没有编译,要么没有限制访问。似乎没有办法做到这一点,但我期待着看到答案!我不会想到不同的集会。很酷的解决方案!老实说,这是我能想到的唯一解决办法——确实是一个非常奇怪的问题!在Gulshan以外的语言中,是否可以使用“我知道”,在任何其他.NET语言(VB,F?)中,也可能与C++或java都有相同的设置。不太熟悉其他语言,或者至少不熟悉汇编级访问限制。@ Gulshan——你可以利用C++中的私有继承,如在C语言中不支持的。但是,该死的,你打败了我,这是一个可以接受的答案,但是,因为这意味着您现在必须以完全不同的语法引用Parent.Child1和Child2?您可以用相同的方式实例化它们(
var c1=new Child1();var c2=new Child2();
)。这就是面试官想要的吗。。。谁知道呢?