抽象クラスでコンストラクタとプライベートメンバーが必要なのはなぜですか?私たちは今までにそのクラスのインスタンスを作成するつもりはありません。抽象クラスにコンストラクタとプライベートメンバーが必要なのはなぜですか?
答えて
派生クラスのインスタンスだけインスタンスを作成します。これらの派生クラスは依然としてコンストラクタを呼び出す必要があり、依然として抽象クラスのメンバを呼び出すことができます。つまり、プライベートメンバを使用できます。
(...ではないひどく有用な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. RouteConfigとクラス、なぜコンストラクタがサービスとルータを必要とするのですか?
- 4. java.sql.Statementが抽象クラスではなく、インタフェースであるのはなぜですか?
- 5. MFCの抽象基本クラスでDECLARE_DYNAMICが必要ですか?
- 6. なぜコンパイラはこのクラスが抽象クラス(C++)だと思いますか?
- 7. 抽象クラスのコンストラクタの使い方は
- 8. 純粋に仮想/抽象クラスは、特に保護されたconstメンバ変数にコンストラクタを必要とするのはなぜですか?
- 9. 抽象クラスの必要性はここにありますか?
- 10. MailDefinitionクラスにSystem.Web.UI.Controlが必要なのはなぜですか?
- 11. immutable.jsクラスに "new"が必要ないのはなぜですか?
- 12. 抽象クラスのpublicコンストラクタには十分な理由があります
- 13. C++未定義抽象クラスのコンストラクタ
- 14. スカラクラスのコンストラクタと抽象型
- 15. なぜサブクラス化と抽象エンティティのときに親エンティティを設定する必要がありますか?
- 16. 抽象クラス対抽象クラス
- 17. リフレクトで抽象基底クラスからコンストラクタにアクセスする
- 18. なぜgccとclangは抽象クラスを構築できますか?
- 19. Scalaのコンストラクタ抽象
- 20. iOSでは、UIGestureRecognizerは抽象クラスの場合、なぜインスタンス化できますか?
- 21. なぜJavaで抽象クラスを直列化しないのですか?
- 22. コンストラクタは抽象クラスからオブジェクトを作ることができません
- 23. は、私はMagentoの抽象ブロックをオーバーライドする必要が抽象ブロック
- 24. 抽象メンバが存在しない場合、基本クラスを抽象クラスにする必要がありますか?
- 25. WCFデシリアライザでオブジェクトを初期化するときに、抽象基本クラスのコンストラクタが呼び出されないのはなぜですか?
- 26. クラスは抽象宣言または抽象メソッドを実装する必要があります
- 27. 抽象クラスには最終的なメソッドがありますか?
- 28. HttpServletクラスが抽象クラスとして宣言されているのはなぜですか?
- 29. なぜ内部クラスは別の内部クラスのプライベートメンバーにアクセスできますか?
- 30. HttpServletクラスを抽象として宣言する必要はありますか?