2011-08-18 3 views
3
class Parent 
{ 
    public int GetNo() 
    { 
     return 1; 
    } 
} 

class Child : Parent 
{   
    public Child() 
    { 

    } 

    public int GetNo() 
    {      
     return 2; 
    } 
} 

Parent p = new Child(); 
p.GetNo(); 

그러나 Base.GetNo()을 호출합니다. 만약 내가베이스에서 virutal을 사용하는 경우 전화가 Child.GetNo() 하지만 내가베이스에서 이미 사용할 수 없습니다.베이스에서 이미 클래스에서 파생 된 내 클래스를 파생시켜야합니다. 그래서 거기에 기본의 기존 기능을 수정할 수있는 방법은 없습니다. 수업.기본 클래스 객체를 사용하여 파생 함수를 호출하는 방법

모든 위약금은 가치가 있습니다. 감사

당신은 그것을 캐스트 할 수
+0

사용하려는 컨텍스트에 대한 추가 정보가 있습니까? 기본 클래스 메쏘드가 재정의 (override) 될 의도가 아니었기 때문에 계승에 의해서가 아니라 구성으로 해결하는 것이 더 좋은가? – harri

답변

6

:

((Child)p).GetNo(); 

또는

if(p is Child) 
    (p as Child).GetNo(); 
+3

+1, 코드가 결과 null을 처리하지 못하면 'as'로 형 변환하는 것을 좋아하지 않지만. –

0

당신은 예를 들어, 명시 적 캐스트와 함께이 강제 할 수 있습니다

((Child)p).GetNo(); 

또는 숨기기를 사용할 수 있습니다.

변수를 메서드를 숨기는 클래스에 입력하면 후자 만 호출됩니다.

정말로 제대로 메소드를 오버라이드해야하고 컴파일 된 DLL에서 개발자가 직접 메소드를 가상으로 만들 수 있는지 (그리고 그렇지 않은 경우) 또는 오픈 소스 프로젝트가 소스 코드를 직접 수정하십시오.

+1

"new"로 "숨김"을하면 같은 결과가 적용됩니다. "'p.GetNo();'"는 자식이 아닌 부모 코드를 반환합니다. –

+0

@Jalal 그건 내가 말한거야. * 변수를 메서드를 숨기는 클래스에 입력하면 후자 만 호출된다고 생각한다. 나는 응답의 완성을 위해 숨기는 것을 포함한다. – RobV

0

virtual을 메서드에 선언하지 않으면 변수를 Parent으로 선언했기 때문에 기본 메서드가 항상 호출됩니다.

Child p = new Child(); 
p.GetNo(); 

또는 :

Parent p = new Child(); 
((Child)p).GetNo(); 
0

당신이 기본 클래스에 virtual를 추가 할 수없는 경우에, 당신은 단지 하나 귀하의 GetNo 방법을 Child으로 변수를 선언하거나 Child에 캐스팅하고 호출 할 수 있습니다 나는 여기에 왔으므로 캐스트를 사용하지 않는 솔루션을 찾을 수 있었지만 여기서는 찾지 못했기 때문에 하나였다.

아마도 누군가에게 도움이 될 수 있습니다.

abstract class Parent 
{ 
    public int GetNo() 
    { 
     return GetNoImpl(); 
    } 

    protected abstract int GetNoImpl(); 

} 

class Child : Parent 
{   
    public Child() 
    { 

    } 

    protected override int GetNoImpl(); 
    {      
     return 2; 
    } 
} 

Parent p = new Child(); 
p.GetNo(); 

참고 : 상위 클래스는 추상입니다.

관련 문제