2013-06-09 5 views
0

변수를 사용하여 다른 클래스를 인스턴스화하려고합니다. 예를 들어 는 :다른 클래스에 동일한 변수 이름을 사용하는 방법

Object blah; 
class1 ex1; 
class2 ex2; 

public void test(int i){ 
    if(i == 1){ 
     blah = new class1(); 
    } else { 
     blah = new class2(); 
    } 
} 

어떻게 자바에서이 일을 가겠어요?

편집 1 : 죄송합니다. 이제 자세히 알려 드리겠습니다.

의 내가 세 가지 클래스가 있다고 가정 해 봅시다 :

public class B1{ 
    C instanceC; 

    public B1(){ 
    instanceC = new C(); 
    //uses a method of instanceC. 
    } 
} 
public class B2{ 
    C instanceC; 

    public C(){ 
    instanceC = new C(); 
    //uses a method of instanceC. 
    } 
} 
: 내 주요이며, B. B는 문제는 이것이다 C.

를 사용하여 사용 A, B와 C

A는을 A의

다음 :

public class A implements MouseListener{ 
    Object blah; 
    B1 instanceB1; 
    B2 instanceB2; 

    public void test(int i){ 
     if(i == 1){ 
      blah = new B1(); 
     } else { 
      blah = new B2(); 
     } 
    } 
//I left the other mouseListener methods blank 
    public void mouseReleased(int i){ 
     blah.instanceC.someMethod(); 
    } 

    public static void main(String[] args) { 
     A instanceA = new A(); 
     A.test(1); 
    } 
} 

편집 2 : 내가 사용하려고 instanceC.someMethod() 또는 instanceC.someVariable 그것은 널 포인터 예외를 제공합니다.

이 내용이 충분히 분명 해졌기를 바랍니다. 혼란 스러울 경우 나에게 알려주십시오. 제가 더 단순화 할 수 있는지 알게 될 것입니다. 이미 도움이 된 사람들 덕분에!   —하지만 Object에없는 그것의 모든 메서드 나 속성을 사용하는 것이 어색 할 것 (당신이 인스턴스가 아닌 클래스와 new을 사용하는 것보다 다른) 일 것이다 blahObject로 선언 된 경우

+7

해당 코드 뒤에있는 의도는 효과가 있지만 어쩌면 좋은 생각이 아닙니다. –

+1

"다른"클래스는 어떻게됩니까? 공통 기본 클래스가 실제로'Object' 인 경우 디자인 문제가 있습니다. – fge

+0

스칼라의 케이스 클래스를 살펴볼 수는 있지만 관련이 없다고 생각합니다. 그냥 거기 던져 버리고 싶어. –

답변

5

, .

일반적인 방법은 인터페이스입니다. 인터페이스는 class1class2의 공통 특성을 정의한 다음 인터페이스를 사용하여 blah을 선언합니다. 그런 다음 구체적인 클래스를 쉽게 만들 수 있고 공통된 특성에 액세스 할 수 있습니다.

예컨대 :

interface Foo { 
    void someCommonMethod(); 
} 

class Class1 implements Foo { 
    void someCommonMethod() { 
     // implementation 
    } 
} 

class Class2 implements Foo { 
    void someCommonMethod() { 
     // implementation 
    } 
} 

public void test(int i){ 
    if(i == 1){ 
     blah = new Class1(); 
    } else { 
     blah = new Class2(); 
    } 

    // ...use `someCommonMethod` on `blah`... 
} 
+0

안녕하세요. T.J. 빠른 답장과 제안에 감사드립니다. 나는 모든 사람들이 나의 상황에 대해 더 잘 이해할 수 있기를 희망하면서 나의 상황을 더욱 분명히했다. – Recur

+0

@Recur : 여전히 같은 대답입니다. 'B1.C'와'B2.C'가 모두 구현 된 인터페이스를 가지고 인터페이스를 사용하여'instanceC'를 선언하십시오. –

0

코드는 컴파일되지 않습니다.

  • B1 및 B2는 무엇입니까? C()은 무엇입니까? 서명은 생성자와 비슷하지만 이름은 아닙니다. 생성자가 아닌 경우 이 B1B2 내에서 초기화된다는 것을 어떻게 보장할까요?
  • A instanceA = new instanceA();이란 무엇입니까? A instanceA = new A();이 될까요? instanceA.test()으로 전화 하시겠습니까?

내 가정이 맞다면, 당신은 두 개의 서로 다른 객체의 instanceC에 액세스하려고는 질문은, 그런 경우 사용 반사의 경우, "그것은 항상? instanceC라는"에 의해 현장을 찾아 이름.

클래스의 모든 필드를 반복하여 처리하고 싶다면 반사를 사용하고 필드를 반복하여 유형을 확인하고 적절한 필드 유형으로 메소드를 호출하십시오.

+0

네, 항상 인스턴스 C로 명명됩니다. 나는 그 때의 반성을 살펴볼 것이다. 감사. – Recur

관련 문제