抽象クラスにコンストラクターとプライベート メンバーが必要なのはなぜですか? そのクラスのインスタンスを作成するつもりはありません。
6 に答える
派生クラスのインスタンスだけであるインスタンスを作成します。これらの派生クラスは引き続きコンストラクターを呼び出す必要があり、抽象クラスのメンバーを呼び出すことができます。これにより、プライベート メンバーが使用される場合があります。
以下に例を示します (あまり便利なものではありませんが、基本的な考え方を示すためだけに...)
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 クラスを拡張します。しかし、単純に個人を直接インスタンス化することは決してありません。
アドホック コードやプロトタイピングを行っていると仮定すると、抽象クラス (または場合によってはインターフェイス) をインスタンス化することがあります。それらは匿名内部クラス ( 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など、この動作の多用に依存しています。