3

インスタンス変数として Skill の配列を持つ Champion というクラスがあります。

「public final Skill[] getSkills()」というメソッドを実装します。Skill[] は、Skill という別のオブジェクトの配列です。

メソッド canHeal 内のスキルの配列をチェックする「public final boolean canHeal()」というメソッドを実装する Support というサブクラスがあります。

Skill[] x = this.getSkills() または Skill[] x = super.getSkills() を記述して Skill の配列を取得する必要がありますが、その理由は何ですか?

メソッド getSkills はクラス Champion でのみ定義され、クラス Support ではオーバーライドされないことに注意してください。

前もって感謝します。

4

4 に答える 4

3

このsuperキーワードを使用すると、クラスがオーバーライドまたはシャドウしたメソッドの基本クラスのバージョンを呼び出すことができます。

クラスに別のgetSkills()メソッドがない場合super、効果はありません。

于 2013-03-05T15:55:08.137 に答える
2

なしで関数を呼び出す方が良いと思いますsuper

まず第一に、今のところ違いがあります。将来、クラスでこの関数をオーバーライドする場合、見つけるのが難しくなります (少なくとも注意が必要です)。

関数をオーバーライドする場合は、関数super.getSkills()内で呼び出すことができます。

于 2013-03-05T15:57:33.963 に答える
0

どちらもすべきではありません。追加this.は不要でありsuper.、将来オーバーライドする場合、追加するとクラスが壊れる可能性がありますgetSkills()。だからただやってください:

Skill[] x = getSkills();

現在の状況では、単にスーパークラスで定義されたメソッドを呼び出すだけですが、将来オーバーライドする理由がある場合getSkills()(たとえば、クラスが別の方法を使用したり、追加の条件がある場合など)、それが自動的に使用されます。これは、スーパークラス メソッドを呼び出し続けるよりも正しい動作である可能性が高くなります。

一般に、必要な場合にのみオーバーライドされたメソッド内で呼び出すsuper.someMethod()必要があります (たとえば、一部のロジックや副作用を複製しないようにするため)。別のメソッドで使用するのは、独自の実装ではなく、スーパークラスの実装が必要であることが確実な場合にのみ行う必要があります。

于 2013-03-05T16:06:19.510 に答える
-1

Supportはチャンピオンなので、どちらも使用できると思いますが、super.getSkillsを使用すると、スーパークラスのメソッドを呼び出していることがコードでより明確になります。

于 2013-03-05T15:55:53.003 に答える