2017-10-15 1 views
-2

一般的なセットアップロジックを抽象クラスに遅らせたいと思っています。共通セットアップ論理がパラメータ化される。私はそれでスイングを取って、抽象的なコンストラクタ製:抽象パラメータコンストラクタ

public abstract class CondimentDecorator extends Beverage { 
    protected Beverage beverage; 

    public CondimentDecorator(Beverage beverage) { 
    this.beverage = beverage; 
    } 
... 

上記のクラスの具体的なIMPLは、このようになります。これは、コンパイルされません

public class Soy extends CondimentDecorator { 

public String getDescription() { 
    return beverage.getDescription() + ", Soy"; 
} 
.... 

を。

public class Soy extends CondimentDecorator { 
^
required: Beverage 
found: no arguments 
reason: actual and formal argument lists differ in length 

飲み物を受け入れてスーパー(飲料)を呼び出すコンストラクタを追加すると、このコンパイルが行われます。私の質問は:

私はスーパークラスのコンストラクタに完全に満足しているとコンパイル時にJavaが見えないのですが、public ConcreteClass(Beverage bev) {super(bev)}を書くのは時間の無駄ですか?私はこれを達成する方法を示すための

ボーナスポイント:)

編集:「あなたはドン場合

:それは、これは、関連する部分はこれですWhy default constructor is required in a parent class if it has an argument-ed constructor? の重複した示唆されました(Bと同様に)明示的にコンストラクタを指定すると、Javaコンパイラは次のようにパラメータなしコンストラクタを作成します。

B() 
{ 
    super(); 
} 

ありがとうございます。たとえその質問が実際にのno-argコンストラクタで起こっていることを明らかにしても、これは確かに重複していません。 私はまだここに座っていると思います:Javaコンパイラは、親クラスがすでにargコンストラクタを持っていて、子クラスのものを生成していないのと同様の方法でそれを生成できないのはなぜですか? 本当に腫れ言語のようには見えませんか?

+0

個人的には、私はexpilcitコーディングスタイルが好きです。 Eclipseは必要なコンストラクタを生成します。 '新しいConcreteClass(飲み物)'を見ると、このコンストラクタの定義を直接指し示しますが、あなたの提案は有効な定義の階層を検索してくれます。 –

+0

私は心から明示的なコーディングスタイルについてあなたに同意します。しかし、私はあなたがクラスを見ても素早く、それは* no *コンストラクタがそれを見ているように階層を上っているのを見ていると思います*コンストラクタthats simply super() – Jarvis

答えて

0

スーパークラスに1つの引数コンストラクタを定義しました。あなたはそうのような非引数コンストラクタを持っていない:

public CondimentDecorator() {// do something} 

あなたの大豆クラスがデフォルトでCondimentDecoratorのコンストラクタを継承するとして、それが唯一の引数(したがって、引数なしのための警告)と1を継承します。上記のように、コードをコンパイルするために、引数のないコンストラクタを手動で提供する必要があります。

+1

コンストラクタを提供する必要はありません引数なしで、彼の状況で彼はお​​そらくそれを望んでいない。 – MCMastery

0

デフォルトでは、Javaはdefault constructor(引数なし)となります...しかし、新しいコンストラクタを追加すると、このデフォルトのコンストラクタが削除されます。 スーパークラスを初期化する唯一の方法は、独自のコンストラクタを呼び出すことです。
あなたのサブクラスはスーパークラスのコンストラクタを最初に呼び出す必要があります(スーパークラスのフィールドを初期化するなど)。そして、そのフィールドは...