2014-04-24 4 views
0

Foo 클래스가 있고 Foo를 확장하는 Foo1과 Foo2 클래스가 두 개 있다고 가정 해 보겠습니다.새 클래스를 만들지 않고 클래스의 클래스를 변경하는 방법은 무엇입니까?

Foo가 Foo1 인 것으로 가정 해 봅시다. 생성자를 사용하지 않고 변경하려고합니다. 는 F의 필드를 변경의 문제라면, 내가 수동으로 할 수 있습니다 :

f.field1= .. 
f.field2= .. 

하지만이 FOO2로를 변경하려는 경우 내가 무엇을 할 수 있습니까?

N.B는 : 요점은 내가 그런 일을하고 싶은 것입니다 :

Foo f=new Foo1(...); 
Foo g=f; 
g=new Foo2(...); 

및 g 변경,하지만 분명이 작동하지 않을 때 F 변화가 있습니다.

+1

Java에있는 것들을 변경할 수 없습니다. 당신은 다른 것들을 만들 수 있습니다. – pamphlet

+0

아마 당신은 정교하고 싶습니까? Foo1을한다면 f1 = new Foo1(); Foo g = f1; g.setSomething ("val")과 같이 g와 f1을 모두 변경합니다. 나는 왜 당신이 g = new Foo2()를 가지고 있는지 모르겠다. 그리고이 경우에 "g가 바뀔 때 f가 변한다"는 것은 무엇을 의미 하는가? – mvmn

+0

나는 f와 g가 Foo2가되도록하고 싶습니다. g.setSomething ("...")을 사용하여 얻을 수없는 것입니다. – Arnaud

답변

1

아마도 이러한 행에서 뭔가를 할 수 있습니다. 참고 :이 코드는 의사 코드입니다.

abstract class Common{ 
... 
} 

class Foo{ 
    private Common currentReference; 

    public Foo(...){ 
    currentReference = new Foo1(); 
    } 

    public Foo changeReferenceToClass(Class clazz){ 
    ... 
    currentReference = clazz.newInstance(); 
    ... 
    return this; 
    } 

    public <T extends Common> T getReference() 
    { 
    return (T) currentReference; 
    } 
} 

class Foo1 extends Common{ 
... 
} 

class Foo2 extends Common{ 
... 
} 

Foo f=new Foo(...); 
Foo g=f; 
g=g.changeReferenceToClass(Foo2.class); 

이것이 않는 것은 :

  • 이 예에서 (A common 인터페이스를 가진 개체의 Common 추상 클래스에 대한 참조를 포함하는 클래스를 만들
  • 가에 대한 참조를 인스턴스화합니다. 구축시의 디폴트 값 (이 예에서는 Foo1).
  • 제안 방법은 changeget입니다.
  • 한 곳에서 FOO2로 참조를 변경할 때 Foo2에 대한 참조를 개최 g을 변경할 때, 당신은, 예에서 모든 장소

에 액세스 할 수 있습니다, fFoo2에 대한 참조를 개최합니다 너무.

1

Java는 static typed programming languagestrong typed이므로 Foo2Foo의 하위 클래스가 아니면 작동하지 않습니다. 그러나이 작업을 수행하더라도 변수의 유형이 아닌 변수의 객체 참조 유형 (및 다형성 활성화) 만 변경합니다.

+0

그 이유는 Java가 정적으로 입력된다는 것입니다. 그것은 동적으로 입력 할 수 있으며 여전히 개체의 클래스를 변경할 수 없습니다. 타입 시스템은 런타임시 작동하는 것입니다. 컴파일러는 타입 시스템의 규칙을 따르는 데 도움이됩니다. –

+0

@EdwinDalorzo 나는 자바가 강력하다는 점도 덧붙였다. –

0

당신이 당신이 그것을 제한하는 타입으로 선언했기 때문에 자바에서는 그렇게 할 수 없습니다. 이것이 정적 타이핑이 작동하는 방식입니다. 그래야 다음과 같이 할 수 있습니다.

Foo g = new Foo2(); 
((Foo2)g).gInstanceMethod(); 
0

다른 사람들은 기존 개체의 클래스를 변경할 수없는 이유를 설명했습니다. 그러나 가능한 경우에도 Java 참조가 작동하는 방식 때문에 수행하려는 작업이 작동하지 않습니다.

Foo f=new Foo1(...); 

이 줄 힙에서 새로운 객체를 할당하여 초기화하는 Foo1 생성자를 호출하고, 가변 f에 해당 개체에 대한 참조 를 저장한다.

Foo g=f; 

이 광고 카피 새로운 변수 g기준 값 (즉, 사본 객체가 참조되는 어드레스가 아니라).

g=new Foo2(...); 

이 줄 힙에서 새로운 객체를 할당하여 초기화하는 Foo2 생성자를 호출하고, 이전에 존재 저장된 기준을 덮어 g에 새로운 오브젝트에 참조를 저장한다. 이전에 g에 의해 참조 된 개체는이 작업의 영향을받지 않습니다.

+0

예, 이것은 제가 "분명히 작동하지 않습니다"라는 의미입니다. – Arnaud

관련 문제