从子类的子类访问父成员

本文关键字:子类 父成员 访问 | 更新日期: 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

, protected internal显式地是"protected OR internal"。