2010-04-07 4 views
0

편집 한 슈퍼 클래스 내에서 확장 한 클래스 필드를 공유 : 지점에 직선자바 클래스를 확장 -

... 나는 클래스가

public class P_Gen{ 
    protected String s; 
    protected Object oP_Gen; 
    protected Object oP_Gen2; 
    public P_Gen(String str){ 
     s = str; 
     oP_Gen = new MyClass(this); 
     oP_Gen2 = new MyClass2(this); 
    } 
} 

확장 클래스 :

public class P extends P_Gen{ 
    protected Object oP; 
    public P(String str){  
     super(str); 
     oP = new MyClass(this); 
    } 
} 

내 클래스 :

public class MyClass{ 
    protected Object oMC; 
    public MyClass(P extendedObject){ 
     this.oMC = extendedObject.oP; 
    } 
} 

MyClass2의 :

public class MyClass2{ 
    protected Object oMC2; 
    public MyClass(P_Gen thisObject){ 
     this.oMC2 = thisObject.oP; 
    } 
} 

더 클래스 P_Gen 위에 표시된 줄을 나에게 오류를 제공합니다. "기호 생성자 MyClass에 (P_Gen를) 찾을 수 없습니다"

oP_Gen = new MyClass(this); 

진술

내가 달성하고자하는 것은 MyClass2에서 P.oP를 사용할 수있게 만드는 것입니다.

필자의 초기 생각은 P. this === P_Gen이었다. 즉, super()에서 호출하면 P_Gen이 사라지고 왼쪽에있는 것은 확장 클래스입니다.

+0

좋아, 나는 한 무리의 MyClass (1 .... x)있다. 그것들은 모두 P_Gen 안에서 인스턴스화 될 필요가 있습니다. 하지만 P_Gen뿐만 아니라 P에 액세스 할 수 있기를 바랍니다. 그게 가능하니? – Bastan

답변

0

, 클래스 MyClass2의에서

  1. 는, 생성자의 이름은해야한다 'MyClass2의'이 같은 생성자를 정의하기 위해 트레이 해달라고 왜
  2. :
public MyClass(P_Gen thisObject){...} 
public MyClass2(P_Gen thisObject){...} 

이렇게하면 다음과 같이 할 수 있습니다.

,210
new MyClass(new P()); 

은 또한 당신은 그럼 당신은 oP 변수를 얻을 수 있으며, MyClassMyClass2 contructors 내부 PthisObject 캐스팅해야합니다. 내 추천 4 이제는 자바 상속에 대해 좀 더주의 깊게 읽어 보시기 바랍니다.

좋은 밤 잠 후 JP

0

나는 doSomething() 메서드가없는 코드를 사용하여 약간 혼란 스럽지만 P_Gen이 추상 메서드 doSomething()을 사용하는 추상 클래스의 이점을 누릴 수 있습니다. 그러면 P는 그 메소드를 구현할 수 있고, P_Gen에 대한 참조가있는 어떤 것이라도 그것을 호출 할 수 있습니다 (P의 구현을 얻습니다). 확인

+0

나는 내 편에서 몇 가지 테스트를 한 후에 전체 질문을 편집했다. 희망은 더 센스를 만듭니다. – Bastan

+0

추가 질문 : P_Gen.oP_Gen과 P.oP는 동일한 객체를위한 것입니까? 아니면 P 인스턴스에 oP와 oP_Gen이 있어야합니까? – nojo

+0

마지막 질문으로 무엇을 얻었습니까? 만약 그들이 같은 객체가되도록되어 있다면, P는 oP 멤버를 선언해서는 안되며, 캐스팅없이 oP_Gen에 접근 할 수 있습니다. – nojo

0

.... 그것은이 아닌 내가 그렇게하고 싶어하는 것은 잘못하지만 내 방식 모두. 나는 OOP의 시작으로 되돌아 갔다. 부끄러운 줄 알아. 어쨌든, @ juanp에 대한 답변을 주셨습니다. 왜냐하면 그는 "내 추천은 자바 상속에 대해 조금 더 리드해야한다."라고 말했기 때문이다.관심이있는 사람들을 위해

가, 여기가 어떻게 보일지입니다 :

생성 된 P_Gen 클래스 :

public abstract class P_Gen{ 
    protected String s; 
    protected Object oP; 
    public P_Gen(String str){ 
     this.s = str; 
     init(str); 
    } 

    protected void init(String str){ 
     if(this instanceof P){ 
      oP = new MyClass((P)this); 
     } 
    } 
} 

확장 P 클래스 :

public class P extends P_Gen{ 
    public String sSTR; 
    public P(String str){ 
     super(str); 
    } 

    @Override 
    protected void init(String str){ 
     this.sSTR = str; 
     this.oP = new MyClass(this); 
    } 
} 

MyClass의 클래스 :

public class MyClass{ 
    protected Object oMC; 
    public MyClass(P extendedObject){ 
     this.oMC = extendedObject.sSTR; 
    } 
} 

내가 한 것은 MyClass 인스턴스 생성을 생성자에서 init 함수로 옮기는 것입니다. 그 init 함수는 확장 클래스에서 오버라이드된다. ..... 매우 기본적인 것들.

더 기본적인 것이 아니라 직접 P_Gen 클래스에 인스턴스를 추가하여 인스턴스가 직접 생성되는 것을 방지합니다. 나는 또한 P_Gen에 추상적 인 초기화 메소드를 선언 할 수있다.

이 모든 것이 나를 생각하게 만듭니다 .... :-) ... 또 다른 날. 저를 도와 주셔서 감사합니다.

관련 문제