2012-02-16 13 views
2

次のような場合、どのようなOO設計が良いか分かりません。スーパークラスからすべてのデータを取得する(this =)

まず第一に私はあなたが使用することはできません知っている:

this = anObject; 

しかし、次のように私のsitiuationです。私は、20以上のデータフィールドを持つスーパークラス(Film)を持っています。サブクラス(ComedyFilm)はスーパークラスを拡張し、ちょうど3つの追加のデータフィールドを持ちます。

これは私が私のサブクラスに配置したいコードです:

public ComedyFilm(GenericFilm parent, FilmRating rating) { 
     this = parent; 

} 

ComedyFilmの新しいインスタンスを作成するとき、それはのようなものになるように:

Film myFilm = new Film(.... long constructor); 
ComedyFilm myComedyFilm = new ComedyFilm(myFilm, FilmRating.EIGHTEEN); 

ありますコンストラクタのすべての変数を取得/設定せずにこれを行う簡単な方法は?せずに

this.filmName = parent.filmname; 
    this.directors = parent.directors; 
    //etc... 

ありがとう!

+0

映画は抽象ですか? – Freiheit

+1

なぜフィルムデータと評価を受け取り、その長いスーパーコンストラクタを内部的に呼び出す別のコンストラクタを作成しないのですか? – Thomas

+1

なぜ映画を制作してからコメディ映画を制作しますか?長いコンストラクタやゲッターとセッターだけを持つComedyFilmだけではないのですか? – talnicolas

答えて

3

派生クラスは、ベースクラスのフィールドをコピーするために、ベースクラスのコンストラクタに遅延する必要があります。つまり、ComedyFilmコンストラクタの最初の行にはsuper(someArgumentsForTheBaseClass)が続き、派生クラスを初期化するために必要な作業が続きます。

+1

_スーパークラスコンストラクタの_Invocationは、サブクラスコンストラクタ_の最初の行でなければなりません。 ([キーワードスーパーの使用](http://docs.oracle.com/javase/tutorial/java/IandI/super.html)から) – enzom83

2

必要があります。

public class ComedyFilm extends Film { 
    public ComedyFilm(GenericFilm parent, FilmRating rating, FilmName filmName, Directors directors) { 
     super(FilmName filmName, Directors directors); 
     //bla 
     } 
} 
0

私はComedyFilmFilmから作成することになり、いくつかのファクトリメソッドとなるだろう:

Film myFilm = new Film(...); 
ComedyFilm comedy = ComedyFactory.createComedyFilm(myFilm, FilmRating.EIGHTEEN); 

public class ComedyFactory { 
    public static ComedyFilm createComedyFilm(Film parent, FilmRating rating) { 
     ComedyFilm comedy = new ComedyFilm(parent); 
     comedy.setRating(rating); 
     return comedy; 
    } 
} 

をしかし、あなたはまだFilmから、この場合には(プロトタイプからすべてのプロパティをコピーするComedyFilmでコンストラクタを作成する必要があります)。それがプロトタイプの仕組みですね。

関連する問題