Java におけるコンストラクターの継承について
一般的な期待にもかかわらず、Java ではコンストラクターは継承されません。この設計上の決定は、開発者の間で好奇心と疑問を引き起こしました。
コンストラクターが継承されない理由
次の例を考えてみましょう:
public class Super { public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ this.serviceA = serviceA; //etc } }
コンストラクターが継承された場合、最終的に Object から派生したクラスを含むすべてのクラスがパラメーターのないコンストラクターを所有します。これは、特に次のような場合に論理的なジレンマを引き起こす可能性があります:
FileInputStream stream = new FileInputStream();
指定されたパラメーターなしでこの行はどのようなアクションを実行する必要がありますか?
非継承の利点
コンストラクターの継承がないため、サブクラスはインスタンス化に特定のパラメーターを必要とします。これは、サブクラスで必要なパラメーターとは異なる場合があります。彼らのスーパークラス。これにより、オブジェクト作成時の意図しない動作や一貫性のない動作が防止されます。
代替ソリューション
繰り返しと DRY の問題に対処するために、Java では明示的な「パススルー」の作成が可能です。次のようにスーパークラス コンストラクターにパラメーターを転送するサブクラスのコンストラクター:
public class Son extends Super{ public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){ super(serviceA,serviceB,serviceC); } }
このアプローチでは冗長性を追加し、オブジェクトのインスタンス化よりも明確さと制御を優先し、存在しない継承されたコンストラクターを効果的に置き換えます。
以上がJava でコンストラクターが継承されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。