3

スーパークラスからメソッドを呼び出す理由はありますか?

superメソッドの代わりにメソッドが呼び出される場所をたくさん見つけましたthis

public String getCustomValue() {
    String value = (String) super.getValue(someArgHere);
    return value;
}

何かメリットはありますか?継承に関する大きな問題が 1つありますgetValue。このクラスまたはその子孫のいずれかでgetCustomValueオーバーライドすると、そのオーバーライドが無視され、メソッドが呼び出されますsuper

4

6 に答える 6

2

getValue(...)メソッドを上書きし、本当に確信が持てない限り(あなたの確信はコード内のコメントに値する)、それをバイパスしたい場合はsuper、あなたが行っているように使用すべきではありません。後であなたまたは他の誰かが上書きすることに決めた場合getValue(...)、おそらくその効果を適用したいと思ったでしょうgetCustomValue()

確かにsuper.myMethodOne()from から呼び出すことはできますが、通常のシナリオは、オーバーライドするときにfrommyMethodTwo()を呼び出したい場合です。Ruby などの一部の言語では、メソッドの引数が自動的に渡されるため、再入力する必要がありません。super.myMethodOne()myMethodOne()

以下に一例を示します。

public class A {
    public void close() {

      // do a bunch of things...
    }
}

public class B extends A {
    @Override
    public void close() {
        // close things related to the subclass B
        // and then make sure A is closed as usual...
        super.close();
    }
}
于 2012-11-25T03:16:57.933 に答える
2

super.getValue(someArgHere)getValueスーパークラスのメソッドを呼び出します。対照的に、定義されている場合は、現在のクラスthis.getValue(someArgHere)のメソッドを呼び出します。getValue現在のクラスがオーバーライドされていない場合getValueは、スーパー クラス メソッドが呼び出されます。

于 2012-11-24T21:39:27.860 に答える
1

メソッドがオーバーライドされていない場合、superoverを使用しても技術的な利点はありません。this

ただし、今述べた理由のsuper代わりに使用する方が明確であると言う人もいるかもしれません。thisサブクラスで関数をオーバーライドする場合は、super;を使用する必要があります。そうでない場合は、使用できますthis。推測ゲームをプレイする (またはメソッドがオーバーライドされているかどうかを人々に確認させる) 代わりに、いつsuperでも を意味するときに使用できますsuper

于 2012-11-24T21:38:59.563 に答える
1

継承に関する大きな問題が 1つありますgetValue。このクラスまたはその子孫のいずれかでgetCustomValueオーバーライドすると、そのオーバーライドが無視され、スーパー メソッドが呼び出されます。

次に、superメソッドを明示的に呼び出さずに、単に呼び出しますgetValue。メソッドがオーバーライドされていない場合、デフォルトでスーパーメソッドになります。存在する場合は、オーバーライドされたメソッドが使用されます。

この場合、「利点」について尋ねるのが適切かどうかはわかりません。それは、実際に何を達成しようとしているかによって異なります。

于 2012-11-24T21:40:26.870 に答える
0

事はデザインです。コーディングするときは、それが何であるかに従ってそれを行います! したがって、getValue拡張されたとしても、それは完璧です。それがあなたのクラスが行うことになっているからです。

通常、superから情報、データ、または副作用を取得しsuper type、現在のクラス機能に従って変更または改善するために使用されます。

于 2012-11-24T21:40:10.010 に答える
0

唯一の利点は、クラスがスーパークラスのメソッドをオーバーライドする場合でも、 を使用してスーパークラスのメソッドを呼び出すことができることですsuper

于 2012-11-24T21:57:48.647 に答える