Не могу увидеть родительские методы в производном классе - PullRequest
1 голос
/ 13 октября 2011

Я пытаюсь расширить класс, затем использовать метод из базового класса, но я не вижу его.

Мой код:

class A {
    protected void Foo(){}
}

class B : A {}

class C{
    void Bar(){
         B b = new B();
         b.Foo();
    }
}

Как я могу использоватьb.Foo в C?

Ответы [ 6 ]

1 голос
/ 13 октября 2011

Вы не можете.Foo - это защищенная функция-член класса A, и поэтому ее можно использовать только из класса A или из класса, который наследует ее.

class A 
{
   protected int x() {}
}

class B : A 
{
   void F() 
   {
      A a = new A();  
      B b = new B();  
      a.x();   // Error
      b.x();   // OK
   }
}
1 голос
/ 13 октября 2011

Вы можете увидеть protected метод только внутри классов-потомков.

C не наследуется от B, поэтому по определению не может видеть свои защищенные методы.

0 голосов
/ 13 октября 2011

Поскольку Foo защищен, его нельзя увидеть никому, кроме производных классов.

Чтобы раскрыть его, вам нужно сделать:

class A 
{
    protected void Foo(){}
}

class B : A 
{
    public new void Foo()
    {
        base.Foo()
    }
}

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

0 голосов
/ 13 октября 2011

Сделай это public. Foo() будет виден только для A и его производных классов (например, 'B'). C не является производным классом A.

0 голосов
/ 13 октября 2011

Вам нужно пометить Foo модификатором public, а не защищенным, потому что C не наследует B; он "использует" B.

См. здесь для получения дополнительной информации .

0 голосов
/ 13 октября 2011

Вы должны сделать метод Foo публичным.

class A {
    public void Foo() {}
}

class B : A {}

class C {
    void Bar(){
         B b = new B();
         b.Foo(); // Works
    }
}
...