2011-08-19 6 views
2
public class A 
{ 
    public int F() 
    { 
    // do something 
    } 
} 

public class B : A 
{  
    public static B F() 
    { 
     B b = new B(); 
     // do something more with b 
     b.base.F(); // this doesn't work 
     b.A.F(); // this doesn't work either 
     return b; 
    } 
} 

A.F()를 호출하기위한 올바른 구문은 무엇입니까? B.F()는 정적 함수라는 점에 유의하십시오. 대한정적 함수 내부에서 오버로드 된 기본 클래스 함수를 호출 하시겠습니까?

편집 "이름의 의견을 변경"

는 필수 예제를 벗었이에서 결론 실수를하지 마십시오. 실제로 함수는 XML을 읽으므로 모든 영향을받는 클래스에서 함수 시그니처는 ReadXML (XmlNode parent, int id)입니다.

+0

'((A) B) .F()'를 사용해 보셨습니까? 내 선호하는 솔루션은 F 중 하나의 이름을 바꾸는 것이지만. :) – Chris

+1

이것은 오버로드 기능의 나쁜 사용으로 간주 될 수 없습니까? – m0skit0

+0

이 방법으로는 호출 할 수 없습니다. 클래스 A에서 생성자를 만들고이 생성자 내부에서 F() 메서드를 호출해야합니다. – Gandarez

답변

3

다음은 A 클래스의 F 메소드를 호출하기 위해 작동합니다 (이제는 적절한 대답으로 테스트되었습니다).

public static B F() 
    { 
     B b = new B(); 
     // do something more with b 
     ((A)b).F(); // this works 
     return b; 
    } 

이름을 변경하는 것이 좋습니다. 설명 형 메서드 이름이 int를 반환하는 클래스와 B 클래스를 반환하는 클래스에 대해 동일 할 것이라고 생각하는 것이 어렵습니다. 아마도 후자 모델은 일종의 팩토리 메서드 인 것처럼 보이기 때문에 어딘가에 Create가 있어야합니다.

+0

+1은 "이름 변경"입니다. –

+0

... 실제 응용 프로그램을 알지 못합니다. 이 예제는 최대한 축소되었습니다. – karx11erx

+0

@ karx11erx : 그래,이게 내가 네가해야 할 일보다 생각해야한다고 말한 이유 야. 나는 그것을 잘라내었고 우리가 볼 수있는 것 이상의 것이있을 것이라고 생각했습니다. 그렇지 않으면 나는 당신의 끔찍한 변수와 클래스 이름에 대해 불평했을 것입니다. ;-) – Chris

0

정적 메서드에서 base 또는 this과 같이 인스턴스/상속과 함께 작동해야하는 키워드를 사용하는 것은 불가능하다고 생각합니다. B 클래스에 F()을 호출하면 B 클래스의 인스턴스가 없으므로 어떤 base도 참조 할 수 없습니다. 당신이 B.F()에서 클래스 A의 객체를 생성하고 a.F() 같은 클래스 AF()를 호출하거나 staticAF()을하고 B.F()에서 A.F()를 호출 할 필요가 있습니다 옵션으로

.

+0

'B b = new B();'는 클래스 B의 인스턴스가 없다는 귀하의 진술에 동의하지 않을 것입니다. 또한 옵션은 문제의 코드를 완전히 변경합니다. B.F()에서 A 클래스의 객체를 만드는 것은 생성 된 B 클래스에 일을하는 데 도움이되지 않습니다. 그리고 정적으로 F()를 만들면 "무언가"가하고있는 것으로 가정하는 인스턴스로 작업하는 것을 막을 수 있습니다. – Chris

+0

@Chris 당신이 틀린 것 같아요 ... 당신은 클래스의 인스턴스를 만들 수 있습니다,하지만 당신은 기지와 같은 인스턴스를 다루는 키워드를 사용할 수 없습니다 ... – Incognito

+0

오, 내가 무슨 뜻인지 알 겠어 ... 그가했던 일이 왜 효과가 없었는지를 설명하는 데 유용하지만 나는 아직도 이것이 질문에 대답하지 않는다고 생각한다. – Chris

관련 문제