2014-11-05 1 views
0

"클래스 앨범의 생성자 앨범은 다른 유형에 적용 할 수 없습니다"내가 현재 어려움 나의 새로운 서브 클래스가 컴파일 얻는 데

public class CompilationAlbum extends Album { 

    private String seriesOfAlbums; 

    public CompilationAlbum(String seriesOfAlbums) { 
     this.seriesOfAlbums = seriesOfAlbums; 
     albumType = "Compilation"; 
    } 
} 

사람이 내가 잘못 무엇을 지적 할 수 있습니까? 오류는 생성자와 관련이있는 것 같지만 왜 오류가 발생해야하는지 알 수 없습니다. 또한 오류 메시지는 "실제 및 형식 인수 목록의 길이가 다릅니다."

편집 :

import java.util.ArrayList; 

public class Album { 

    private String name; 
    private ArrayList<Track> trackList; 
    private int length; 
    private int fileSize; 
    private double averageRating; 
    private String albumType; 

    public Album(String name){ 
     this.name = name; 
     trackList = new ArrayList<Track>(); 
    } 
+0

이름을 설정하는 방법에 대한 대화를 이어 가면서 개인 필드를 "문제"로 생각하지 않습니다. 공개 또는 보호 된 get/set 메소드가 있다고 가정하면 필드를 직접 수정하는 대신 해당 메소드 (즉, this.setName (name))를 사용하는 것이 일반적으로 바람직합니다. 여기에 대한 토론을 참조하십시오 : http://stackoverflow.com/questions/2279662/java-protected-fields-vs-public-getters – Shaun

답변

1

:

여기에 적합 할 수 있습니다 접근 방식이다.

public class CompilationAlbum extends Album { 

    private String seriesOfAlbums; 

    public CompilationAlbum(String seriesOfAlbums) { 
     this.seriesOfAlbums = seriesOfAlbums; 
     albumType = "Compilation"; 
    } 
} 

당신이 원하는 :

당신이 쓴 지금은 Album 클래스를 참조하는 것이

public class CompilationAlbum extends Album { 

    private String seriesOfAlbums; 

    public CompilationAlbum(String seriesOfAlbums) { 
     super(seriesOfAlbums); 
     this.seriesOfAlbums = seriesOfAlbums; 
     albumType = "Compilation"; 
    } 
} 

을, 문제는 private 회원입니다. 자식 클래스가 그들에게 접근 할 수 있도록 그 사람들을 protected으로 만드십시오.

+0

방금 ​​앨범 클래스 (빼기 메서드)를 추가하기 위해 내 게시물을 편집했습니다. – Zetland

2

명시 적으로 하위 클래스 생성자의 첫 번째 줄에 슈퍼 클래스의 생성자를 호출하지 않는 경우, super()에 대한 호출은 다음과 같습니다 앨범 클래스, 마이너스 방법은 다음과 같습니다 컴파일러에 의해 삽입됩니다. 앨범에는 인수가없는 생성자가 없으므로 super()에 대한 삽입 된 호출이 유효하지 않으므로 컴파일이 실패합니다.

해결 방법에는 두 가지가 있습니다. 기존 수퍼 클래스 생성자를 String 인수로 호출하거나 (특정 유스 케이스에 맞는 것을 결정해야 함) 수퍼 클래스에 인수가없는 생성자를 추가합니다. 이 생성자의 동작은 실제로 수행하려는 작업에 따라 달라집니다. , 나는 그것이 기본 생성자가없는 추측하고있어 앨범에 대한 소스 코드를 보지 않고

public class CompilationAlbum extends Album { 

    private String seriesOfAlbums; 

    public CompilationAlbum(String name, String seriesOfAlbums) { 
     super(name); 
     this.seriesOfAlbums = seriesOfAlbums; 
     albumType = "Compilation"; 
    } 
} 
+0

방금 ​​앨범 클래스 (빼기 메서드)를 추가하기 위해 내 게시물을 편집했습니다. – Zetland

+0

맞아요. 그래서 우리가 생각한 것입니다. CompilationAlbum 생성자를 super (seriesOfAlbums)로 시작하도록 변경하면 컴파일 오류가 수정됩니다. 또는 실제로 사용 사례에 비추어 볼 때 의미가 없기 때문에 인수가없는 생성자를 Album에 추가 할 수 있습니다. – Shaun

+0

좋아요,'super (seriesOfAlbums);를 추가했는데'albumType'이 private 변수 일 때'albumType'을 생성하려고 시도 할 때 여전히 오류 메시지가 나타납니다. 하위 클래스가 수퍼 클래스를 수정할 수 있도록하는 방법을 알고 있습니까? – Zetland

관련 문제