一般的なセットアップロジックを抽象クラスに遅らせたいと思っています。共通セットアップ論理がパラメータ化される。私はそれでスイングを取って、抽象的なコンストラクタ製:抽象パラメータコンストラクタ
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コンストラクタを持っていて、子クラスのものを生成していないのと同様の方法でそれを生成できないのはなぜですか? 本当に腫れ言語のようには見えませんか?
個人的には、私はexpilcitコーディングスタイルが好きです。 Eclipseは必要なコンストラクタを生成します。 '新しいConcreteClass(飲み物)'を見ると、このコンストラクタの定義を直接指し示しますが、あなたの提案は有効な定義の階層を検索してくれます。 –
私は心から明示的なコーディングスタイルについてあなたに同意します。しかし、私はあなたがクラスを見ても素早く、それは* no *コンストラクタがそれを見ているように階層を上っているのを見ていると思います*コンストラクタthats simply super() – Jarvis