2011-03-03 9 views
23

android.app.Activity에서 파생 된 모든 활동 (ActivityBase)에 대한 기본 클래스가 있습니다. onCreate에서 현재 실행중인 하위 클래스를 기반으로 일부 조건부 논리를 실행하려고합니다. SomeCustomActivityAnotherCustomActivity이 모두 ActivityBase으로 확장되는 경우 부모 클래스 (ActivityBase)에서 현재 실행중인 클래스를 결정할 수 있습니까?부모 클래스에서 자식 클래스 이름 가져 오기

+1

질문과 제목이 일치하지 않습니다. 당신은 하위 클래스 이름을 전혀 원하지 않는다. 오히려'this'가 특정 자식 클래스의 인스턴스인지 테스트하려고합니다. –

+1

수퍼 클래스가 "부모"라고도 지정되어 있지 않습니까? 나는 A가 B - B가 부모이고 A가 자식이라고 정의 된 관계를 들었다. – Rich

+0

예, 상위 클래스를 상위 클래스라고 부르지 만 특별히 하위 클래스의 이름을 알 필요는 없으며 하위 클래스가 어떤 클래스인지 알아야합니다. – gailbear

답변

15

instanceof 연산자를 사용하십시오.

당신이 변수 refSubOne 또는 인스턴스가 있는지 확인하려는 경우, 기본 클래스 및 Base, SubOneSubTwo를라는 두 개의 서브 클래스를 가정하면 SubTwo 당신은 말할 것 :

if(ref instanceof SubOne){ 
} 
else if(ref instanceof SubTwo){ 
} 

참고 : (ref instanceof Base)은 항상 true을 반환합니다.

if(this instanceof SomeCustomActivity) { 
    // do stuff 
} else if (this instanceof AnotherCustomActivity) { 
    // do other stuff 
} 

을 그리고 그 모든 것이 거기에있다된다

+1

이것은 객체 지향 솔루션이 아닙니다. this.getClass(). getSimpleName()을 사용하면 더 편리합니다. 그렇게하면 새 하위 클래스를 도입 할 때마다 상위 코드를 수정할 필요가 없습니다. 또는 각 부모가 자신의 이름을 반환하도록 getName()이라는 추상 메서드를 부모에게 제공합니다. – Evvo

3

난 당신이 예를 들어, instanceof 연산자를 사용하려는 생각합니다.

2

if 문을 사용하는 대신 조건 논리에 대한 추상 메서드를 만들어야합니다. 그런 다음 하위 클래스에 올바른 코드를 실행하게하십시오.

이렇게하면 새 하위 클래스를 만들 때마다 기본 클래스를 수정하지 않아도됩니다.

+1

나는 여러 번 다시 구현할 필요가 없습니다. Activity가 특정 코드를 실행해야하는지 파악하고 싶다면 건너 뛰십시오. 예를 들어, 15 개와 15 개가 아닌 경우를 가정 해 봅시다. 15 개 모두 동일한 코드 블록을 실행해야합니다 ... 기본 클래스에서 수행되어야하며 조건부로 실행해야합니다. – Rich

47

경우에 따라 상위 클래스의이 행이이 문제를 해결합니다. 그것은 "아이"클래스 (안 부모)의 이름을 반환

자세한 설명은 여기를 참조하십시오
this.getClass().getName() //String like "com.mycompany.myclassname" 
this.getClass().getSimpleName() //String like "myclassname" 

: 질문에 대답을 담당하는 조건 방법을 만들고, 상위 클래스에서 http://www.coderanch.com/t/324715/java/java/Getting-child-class-name-parent

1

- 처리 논리에서이 메소드를 사용하여 실행할 코드 블록을 결정합니다. 각 하위 클래스는 필요에 따라 결정 방법과 대답을 무시할 수 있습니다. 결과적으로 수퍼 클래스는 하위 클래스에 대한 지식이 없으므로 하위 클래스는 실제 처리 구현을 염려 할 필요가 없습니다.

abstract class A { 

    abstract boolean isItX(); 

    void doX() { ... } 

    void doY() { ... } 

    void process() { 
     if (isItX()) { 
      doX(); 
     } else { 
      doY(); 
     } 
    } 
} 

class B extends A { 
    boolean isItX() { 
     return true; 
    } 
} 

class C extends A { 
    boolean isItX() { 
     return false; 
    } 
} 

자세한 내용은 Hollywood Principle을 참조하십시오.

0

또한 부모의 .getClass() 메소드를 사용 후 런타임 객체 클래스를 반환하기 때문에이 기본적으로 작동이

if(parent.getClass().equals(childObj.class)){ 
//to do .. 
} 

같이 확인할 수 있습니다. 이것은 추상적 인 클래스의 경우 특히 효과적입니다 - 최근 프로젝트에서 저의 테스트를 거쳐 테스트되었습니다.

관련 문제