Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从子类的子类访问父成员_Java_C#_C++_.net - Fatal编程技术网

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();
)。这就是面试官想要的吗。。。谁知道呢?