2011-10-12 2 views
1

클래스를 확장하려고 시도하고 기본 클래스의 메서드를 사용하지만 볼 수 없습니다.파생 클래스에서 부모 메서드를 볼 수 없습니다.

내 코드 :

class A { 
    protected void Foo(){} 
} 

class B : A {} 

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

어떻게 b.Foo이 C에서 사용할 수 있을까?

+0

'C'가'A'도 상속 받았다는 뜻인가요? 그렇다면 코드 * still *이 컴파일되지 않습니다. 이유에 대한 도움말은 http://blogs.msdn.com/b/ericlippert/archive/tags/protected/를 참조하십시오. – dlev

답변

1

수 없습니다. Foo는 A 클래스의 보호 된 멤버 함수이므로 클래스 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 
    } 
} 
+0

"b.x();"가 여러분의 예제에서 오류를 발생시키지 않았습니까? – CheeseSucker

+0

글쎄, 사실 System.Windows.Shapes.Line을 2 개의 변수로 확장하려고합니다. 실제 코드 : 공용 클래스 가장자리 : { <내 변수> 공공 에지 (....) { .... } } 내가 그것을 사용할 때 선하지만, 내가 할 수있는 대중에게 공개 되더라도 방법이나 필드를 보지 못합니다. – gberes

+1

당신은 생각할 것입니다! 그러나 이것은 실제로 좋습니다. 같은 학급에 속한 학급의 인스 탄시 에이션은 그러한 특권을 갖는다. – ZacAttack

0

Foo 공개로 설정해야합니다.

class A { 
    public void Foo() {} 
} 

class B : A {} 

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

누구에게, 왜 downvote? (오프셋을 +1했습니다!) – Reddog

0

당신은 C가 B를 상속하지 않기 때문에 보호보다는 public 수정과 Foo을 표시해야합니다; 그것은 "B"를 사용합니다.

here for more information을 참조하십시오.

1

자손 클래스 내에서 protected 메서드 만 볼 수 있습니다.

CB에서 상속되지 않으므로 정의상 보호 된 메서드를 볼 수 없습니다.

0

public. Foo()A 및 파생 클래스 (예 : 'B')에서만 볼 수 있습니다. CA의 파생 클래스가 아닙니다.

0

Foo는 보호되어 있기 때문에 파생 클래스 이외의 다른 것으로는 볼 수 없습니다.

이 노출하려면 수행해야합니다

class A 
{ 
    protected void Foo(){} 
} 

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

다른 답변이에 감동했지만 아무도 이름이 같은 방법을 노출하는 새로운 키워드의 사용을 언급하지 않지만 다른 접근.

관련 문제