抽象クラスでコンストラクタとプライベートメンバーが必要なのはなぜですか?私たちは今までにそのクラスのインスタンスを作成するつもりはありません。抽象クラスにコンストラクタとプライベートメンバーが必要なのはなぜですか?
答えて
派生クラスのインスタンスだけインスタンスを作成します。これらの派生クラスは依然としてコンストラクタを呼び出す必要があり、依然として抽象クラスのメンバを呼び出すことができます。つまり、プライベートメンバを使用できます。
(...ではないひどく有用な1が、ちょうど基本的な考え方を示すこと)次に例を示します
public abstract class NamedObject
{
private final String name = name;
protected NamedObject(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
public class Computer extends NamedObject
{
private final int processorSpeed;
public Computer(String name, int processorSpeed)
{
super(name); // See, the constructor is useful
this.processorSpeed = processorSpeed;
}
public String toString()
{
return getName() + " (" + processorSpeed + ")";
}
}
私ははしばしば、一般的に組成物を好むという抽象クラスを書くと言うことはできません継承は、私がを実行するとを作成すると、私は確かにコンストラクタとプライベートメンバーを使用します。
抽象クラスは、いくつかのインタフェースの部分実装を提供します。その実装の一部を提供し、クライアントコード(具体的なサブクラス)が特定のもの、つまりカプセル化の原則の拡張にアクセスすることを禁止することを検討することは、完全に合理的です。
一部のメンバーをプライベートとしてマークすると、継承するクラスは保護されたメソッドを呼び出して、その部分的な実装にアクセスします。コンストラクタを提供することにより、サブクラスは、自身の構築中に親のカプセル化状態を初期化することができます。
インターフェイスとは異なり、データフィールドを定義する抽象クラスは、実際にはこれらのデータフィールドが割り当てられるという意味でインスタンス化されます。彼ら自身がインスタンス化されることはありません。サブクラスであるより大きなものの一部としてインスタンス化されます。したがって、サブクラスがビルドされると、スーパータイプも構築されるため、コンストラクタが必要になります。
階層に応じて、抽象クラスは意味と状態を持つことがあります。たとえば、あなたのアプリケーションが学校の場合、あなたは名前とSSNを持つ人物の概念を持つかもしれませんが、学生と教員のために異なるサブタイプがあります。両方のタイプの人が特定の状態構造(名前とSSN)を共有するため、両方のクラスでPersonクラスが拡張されます。しかし、あなたは単に人を直接インスタンス化することはありません。
Jonの答えに加えて、抽象クラスは、サブクラスツリーを浅くしておくと、コンポジションがまだよくなると言いたいと思います。私。いくつかの密接に関連するオブジェクトに共通の基底クラスを提供するのに最適ですが、サブクラスの巨大なツリーを作成するためではありません。
なぜプライベートクラスが必要ですか?私は抽象クラスをインターフェイスと混同していると思います。インタフェースとは異なり、抽象クラスは機能を保持できます。たとえば:
public class AbstractBase{
private int num;
public AbstractBase(int number){
this->num = number;
}
public int method(){
return (this->num * this->templateMethod());
}
public abstract int templateMethod();
}
パブリッククラスConcreteDerivedは、この例ではAbstractBase {
public ConcreteDerived(){
super(4);
}
public int templateMethod(){
return number; //number is the result of some calculation
}
}
を拡張し、you'llは、明示的にAbstractBaseをインスタンス化しませんが、メンバーやコンストラクタを宣言することによって、あなたがカスタマイズすることができますクラスの機能(これはテンプレートメソッドと呼ばれます)。
アドホックなコードやプロトタイプを作成していると仮定すると、時々、抽象クラス(または多分、インタフェースも)をインスタンス化します。彼らは匿名内部クラス(one、two)と呼ばれると、このようになります:
// you have this...
public abstract class SomeClass {
public abstract String returnAString();
}
// ...and this...
public class OtherClass {
public void operate(SomeClass c) {
System.out.println(c.returnAString());
}
}
// ...so you do this:
OtherClass oc = new OtherClass();
// this is one of the reasons why you need to specify a constructor
oc.operate(new SomeClass() {
@Override
public String returnAString() {
return "I'm an anonymous inner class!";
}
});
この例では、もちろん、非常に冗長ですが、ポイントを公開する必要があります。いくつかの既存のフレームワークは、この動作の多量の使用、つまり少なくともApache Wicketに依存しています。
- 1. Java抽象クラス、抽象コンストラクタ
- 2. 抽象クラスがあるときにインターフェイスが必要なのはなぜですか?
- 3. 抽象クラス&コンストラクタ
- 4. インタフェースと抽象クラスのコンストラクタ?
- 5. なぜHttpContextはインターフェイスではなく抽象クラスですか?
- 6. RouteConfigとクラス、なぜコンストラクタがサービスとルータを必要とするのですか?
- 7. MFCの抽象基本クラスでDECLARE_DYNAMICが必要ですか?
- 8. java.sql.Statementが抽象クラスではなく、インタフェースであるのはなぜですか?
- 9. なぜコンパイラはこのクラスが抽象クラス(C++)だと思いますか?
- 10. スカラ継承:なぜ抽象クラスにクラスを定義する必要がありますか?
- 11. コンストラクタを定義する必要がありますか?抽象クラスを継承するクラスですか?
- 12. 抽象クラスをインスタンス化できないため、コンストラクタはなぜ抽象クラスの内部で使用できますか?
- 13. 純粋に仮想/抽象クラスは、特に保護されたconstメンバ変数にコンストラクタを必要とするのはなぜですか?
- 14. クラスが抽象的であることが必要
- 15. 抽象クラスのコンストラクタの使い方は
- 16. 抽象クラスの必要性はここにありますか?
- 17. エラー:クラスが抽象的ではなく、抽象メソッド
- 18. なぜBaseFragmentActivityHoneycombは抽象ですか?
- 19. MailDefinitionクラスにSystem.Web.UI.Controlが必要なのはなぜですか?
- 20. immutable.jsクラスに "new"が必要ないのはなぜですか?
- 21. 抽象クラスのpublicコンストラクタには十分な理由があります
- 22. JavaでPropertiesクラスが必要なのはなぜですか?
- 23. 抽象クラスと抽象メソッド
- 24. 抽象クラスで実装されていないコンストラクタ
- 25. range-v3 yieldにデフォルトのコンストラクタが必要なのはなぜですか?
- 26. C++未定義抽象クラスのコンストラクタ
- 27. なぜ、es6にコンストラクタが必要ですか?
- 28. 抽象クラスのエラーは、単純なクラス
- 29. スカラクラスのコンストラクタと抽象型
- 30. なぜサブクラス化と抽象エンティティのときに親エンティティを設定する必要がありますか?