このメッセージは、Java に厳密に関連しています。メソッドがスーパークラスにある場合、メソッドを呼び出す方法は 2 つあります。
foo();
super.foo();
常に後者を行うことに害はありますか? メソッドの呼び出し元が一目でわかるので、コーディング スタイルとしては後者を好みます。「スーパー」が存在しない、または私が思っていることをしない状況はありますか?
このメッセージは、Java に厳密に関連しています。メソッドがスーパークラスにある場合、メソッドを呼び出す方法は 2 つあります。
foo();
super.foo();
常に後者を行うことに害はありますか? メソッドの呼び出し元が一目でわかるので、コーディング スタイルとしては後者を好みます。「スーパー」が存在しない、または私が思っていることをしない状況はありますか?
あなたが持つかもしれない唯一の害は、ポリモーフィズムを使用したいときだと思うので、呼び出しfoo()
ていくつかのサブクラスが foo をオーバーライドする場合、その効果は呼び出しsuper.foo()
た場合とは異なります。基本的には、コードをどのように設計しているかによって異なります。何の目的。
これが明確になることを願っています。
原則として、super.foo()
クラスfoo()
メソッド内でのみ使用する必要があります。そうでなければ、一般に、OOP の考え方に反します。
メソッド呼び出しがどこから来ているかが一目瞭然だから
OOP では、メソッド呼び出しが「どこから来る」かを知りたくないはずです。あなたのプログラム (またはあなたの考え方) がそれに依存している場合、問題が発生する可能性があります (誰かがメソッドをオーバーライドしようとすると、実際に問題が発生する可能性があります)。メソッドmyobject.foo()
は、myobject のクラスのメソッドとして外部から見える必要があります。そのメソッドが実際にその親の具象クラスに実装されているかどうかは問題ではありません。
それがスーパークラスのメソッドであることは明らかではないので、前者を行うことにはより多くの害があると思います。
ええ、これは基本的に継承チェーンを壊します。
この関数から派生したクラスであっても、継承メカニズムが使用する関数を選択することはできません。
のポイントは、super.foo()
必要な場合にのみ指定できるようにすることであり、他の動作が適切ではないことがわかっています。
サブクラスでのオーバーライド メソッドの使用を明示的に回避したくない場合は、super を使用しないでください。後で誰かがサブクラスのメソッドをオーバーライドしたい場合、常に super を使用すると問題が発生する可能性があります。
これは、デザインをもう一度考え直す必要があることを示しているのではないかと思います。
常にsuper.foo()によって関数を呼び出している場合は、後で関数をオーバーライドすることをブロックします。関数をオーバーライドする機能が必要ない場合は、メソッドとして継承を使用しないでください。この機能にアクセスするため。
私が耳にした設計原則の1つは、「継承よりもコンポジションを優先する」です。これは、コードが継承よりもコンポジションの方が柔軟になるためです。また、継承の肯定的な側面(関数をオーバーライドできる)が得られない場合は、継承を使用しない方が賢明かもしれません。
foo()
なしで呼び出すのではなく、スーパークラスでメソッドを呼び出す場合は、これが望ましい方法ですsuper.
。サブクラスで誰かが上書きfoo()
した場合、スーパー コールは以前と同じメソッドを呼び出しますが、省略するsuper
と上書きされたメソッドが呼び出されるようになりました。そのメソッド呼び出しで何を意図しているかによって異なります。
場合によります。
foo()
として宣言されている場合final
、まったく違いはありません。foo()
がとして宣言されていない場合final
、サブクラスがスーパークラスの の宣言をオーバーライドしfoo()
、予想される動作を完全に変更する可能性があります。
独自のクラスを作成すると、そのクラスfinal
がサブクラス化されるのを防ぐことができ、元の意図が確実に保持されます。