2014-05-23 5 views
2

Сегодня я столкнулся с очень странным вопросом интервью. Интервьюер спросил меня: -Доступ к родительскому элементу из дочернего дочернего класса

Существует класс Parent и имеет метод GetData. Класс Child1 наследует Parent и Child2 наследует Child1. Что вы можете сделать в классе Parent, чтобы метод GetData был доступен из Child1, но не из Child2?

+0

Я пробовал несколько «очевидных» способов, но они либо не собирали, либо не ограничивали доступ. Кажется, не должно быть способа сделать это, но я с нетерпением жду ответа! – BradleyDotNET

ответ

1

Если мы предположим, что родитель и ребенок1 существуют в Ассамблее А, а Child2 существует в сборке B, а сборка А не раскрывает свои внутренние элементы в сборке B, в то время как сборка B ссылается на сборку A, тогда вы можете пометить GetData как внутреннюю, он будет доступен для Child1, но не Child2.

Побочный эффект здесь в том, что он будет виден всей сборке.

Обратите внимание, что защищенное внутренним будет иметь противоположный эффект - он бы GetData видна Child2, так как защищенные внутренний явно «защищенный OR внутренние» согласно MSDN

+0

Я бы не думал о разных собраниях. Прохладный раствор! – BradleyDotNET

+0

Это, честно говоря, единственное решение, о котором я мог думать - очень странный вопрос! – David

+0

возможно на других языках, кроме C#. – Gulshan

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

блин, вы избили меня до этого – Kik

+0

Будет ли это приемлемым ответом, поскольку это означает, что теперь вам нужно ссылаться на Parent.Child1 и Child2 в совершенно другом синтаксисе? – David

+0

Вы можете создать их так же ('var c1 = new Child1(); var c2 = new Child2();'). Это то, чего хотел интервьюер ... кто знает? –

2

родитель класса можно отметить, что это метод, как частные, а затем объявить первый ребенок внутри его собственной декларации.

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(); 
     } 
    } 
Смежные вопросы