2012-01-07 6 views
1

부모 클래스의 정적 메서드 내에서 자식 클래스 상수에 액세스 할 수 있습니까? 정적 부모 메서드에서 하위 클래스 상수에 액세스

public class Model { 

    public static void someMethod(){ 
     HERE I WANT TO GET THE MODEL_NAME constant! 
    } 
} 

public class EventModel extends Model { 
    public static final String MODEL_NAME = "events"; 
} 

내가 전화를 다른 장소에

:

EventModel.someMethod(); 
+3

예를 들어주세요. 나는 그 아이에 관해 알아야 할 부모를 조심합니다. 우리 아빠 한테 물어봐. –

+0

아래에서 내 대답을 올렸으므로 Dave Newton과 동의합니다. 부모 클래스가 자녀에 대해 알아야 할 경우 고려해야 할 디자인 문제가있을 수 있습니다 (항상 그런 것은 아님). – XIVSolutions

+0

디자인 문제가 아닌 상황을 제시 할 수 있습니까? –

답변

3

그것을보십시오!

상수가 private으로 선언되면 아니오입니다. public 인 경우 누구나 액세스 할 수 있으므로 예. 상위 클래스는 여기에서 크게 영향을받지 않습니다.

class Parent { 
    public static void Foo() { 
     int x = Child.YEP; // Ok 
     int y = Child.NOPE; // Error 
    } 
} 

class Child extends Parent { 
    public static final int YEP = 42; 
    private static final int NOPE = 66; 
} 

Foo

Parent에 정의되어있다, 따라서 Child의 전용 멤버에 액세스 할 수 없습니다.

어때요?

class Parent { 
    abstract String getModelName(); 

    public void someMethod() { 
     String myModel = getModelName(); 
    } 
} 

class Child extend Parent { 
    String getModelName() { return "events"; } 
} 

그러나이 방법은 더 이상 공개되지 않습니다.

+0

예제로 업데이트했습니다 – jonepatr

+0

메소드 이름 **은 소문자로 시작해야합니다 **. –

+0

@rogelware 누구입니까? –

1

이 방법이 더 효과적 일 수 있습니다.

getName 메서드를 사용하여 부모 클래스를 정의하십시오. 모델 클래스가 Name 속성을 노출하기를 원한다면 public이 될 수 있습니다. 그렇지 않으면 여기에있는 것처럼 "protected"로 유지할 수 있습니다. "Protected"는이 클래스와 파생 된 (자식) 클래스 내에서 메서드를 볼 수 있도록 유지합니다.

public class Model { 
    private static String MODEL_NAME = "Model"; 

    protected String getModelName(){ 
     return MODEL_NAME; 
    }  
} 

그런 다음 자식 클래스의 이름과 방법에 대한 "재정의"를 정의 :

이 컴파일하고 난 당신이 acheive하려고 생각하는 방법을 실행
public class EventModel extends Model 
{ 
    private static String MODEL_NAME = "events"; 

    @Override // Tells the compiler that this method OVERRIDES the parent method 
    public String getModelName(){ 
     return MODEL_NAME; 
    } 
} 

. . .

편집 : 우. 문제가 생겼습니다. 당신이 정적 방법에서 그것을 참조 할 필요가 놓친. . .

+0

위의 대답이 잘못되었습니다. 나는 당신이 부모의 정적 메서드에서 이것을 액세스해야한다는 사실을 놓쳤습니다. 내 잘못이야 . . . – XIVSolutions

관련 문제