2012-11-05 4 views
1

학교 과제물 작업 중 Person 클래스를 확장 한 Person 클래스와 Student를 확장하는 정규 클래스 CollegeStudent가 있습니다. CollegeStudent는 파일에서 읽고 모든 변수 (추상 수퍼 클래스에 속한 변수 포함)를 설정합니다. 이 모든게 잘 작동합니다.Super() conundrum

그러나 추상 클래스에 생성자가 있어야하는데, 이는 해당 클래스가 입력을 독자적으로 읽을 수 없기 때문에 상황을 복잡하게 만듭니다. 그래서 지금 나는 (아마도) 생성자를 사용하여 각각의 클래스에서 데이터 필드를 설정한다고 가정하지만, 입력을 먼저 읽어야합니다. 여기서 명백한 문제는 superconstructor 호출이 CollegeStudent의 생성자에서 첫 번째 것이어야한다는 것입니다. 이게 문제 야.

모든 것을 그대로 실행 한 다음 필요한 모든 필드를 매개 변수로 사용할 수있는 다른 생성자 메서드를 가질 수 있습니다. 하지만 그 이유는 무엇인지 모르겠습니다. 왜 드라이버가 생성자를 사용하기 위해 CollegeStudent 객체를 만든 다음 첫 번째 객체의 ariables를 사용하여 다시 만들어야합니까?

그 외에도 이것이 어떻게 수행 될지 모르겠다.이 옵션은 나에게 이상하다. 요점이 무엇인지 모르겠다.

미리 감사드립니다 ...

+0

나는이 질문을 이해하기가 어렵다고 생각한다. –

+9

주된 문제는 디자인입니다. 생성자는 파일을 읽지 않아야합니다. 이것은 생성자의 작업이 아닙니다. 대신에 팩토리 메소드를 사용하십시오. –

+0

과제의 임의적 제약 조건이 무엇인지 모를 때 도움이되기 어렵습니다. – climbage

답변

4

좋아, 제 의견에 대해 자세히 설명해 드리겠습니다. 생성자는 자체 매개 변수를 찾기 위해 파일을 읽지 않아야합니다. 그건 그 직업이 아니야. 내가 올바르게 이해한다면 문제는 당신이 가지고 있어야한다는 것입니다.

public CollegeStudent(File f) { 
    // get a, b and c from the file, but how? 
    super(a, b, c); 
} 

그러나 a, b 및 c는 파일에서 가져온 것입니다. super는 생성자의 첫 번째 명령이어야하므로 super를 호출하기 전에 파일을 읽을 수 없으므로 운명에 처하게됩니다. 단순히 이것은 종종 일반적인 OO 패턴입니다

CollegeStudent cs = CollegeStudent.createFromFile(file); 

를 부를 것이다, 파일에서 CollegeStudent를 구성

public CollegeStudent(int a, int b, int c) { 
    super(a, b, c); 
} 

public static CollegeStudent createFromFile(File f) throws IOException { 
    int a; 
    int b; 
    int c; 
    // TODO: read the file and initialize a, b and c 
    return new Student(a, b, c); 
} 

호출자 :

대신 공장 방법을 사용해야합니다 익숙한. 예를 들어 Integer.valueOf()을 참조하십시오.

+0

나는 이해하고 있다고 생각한다 : 기본적으로 드라이버는 클래스를 생성하기 위해 두 번째 메소드를 호출 할 것이다. 하지만 ... 그럼 첫 번째 생성자는 어떤 용도로 사용됩니까? –

+0

오, 알겠지만 ... 그 끝을 알지 못했다 ... 고마워! 알았어! –

+0

모든 것이 createFromFile 메소드에서 초기화 될 수 있고, 우리가 해당 생성자를 사용하는 유일한 이유는 OO를위한 것이라고 말할 수 있습니까?난 이걸 제대로 가져 왔는지 확인하고 싶다. –