これが私が尋ねようとしていることの例です
スーパークラスName.Java
_public class Name{
protected String first;
protected String last;
public Name(String firstName, String lastName){
this.first = firstName;
this.last = lastName;
}
public String initials(){
String theInitials =
first.substring(0, 1) + ". " +
last.substring(0, 1) + ".";
return theInitials;
}
_
そして、サブクラスはThreeNames.Javaです
_public class ThreeNames extends Name{
private String middle;
public ThreeNames(String aFirst, String aMiddle, String aLast){
super(aFirst, aLast);
this.middle = aMiddle;
}
public String initials(){
String theInitials =
super.first.substring(0, 1) + ". " +
middle.substring(0, 1) + ". " +
super.last.substring(0, 1) + ".";
return theInitials;
}
_
ThreeNames example1 = new ThreeNames("Bobby", "Sue" "Smith")
でThreenameオブジェクトを作成してからSystem.out.println(example1.initials());
を呼び出すと、_B.S.S.
_が返されます。
私の質問は、出力が_B.S.
_になるように、Nameクラスにあるinitialsメソッドを呼び出す方法があることです
番号。メソッドをオーバーライドすると、外部からのそのメソッドの呼び出しは、オーバーライドされたメソッドにルーティングされます(もちろん、継承チェーンのさらに下でオーバーライドされた場合を除きます)。次のように、オーバーライドされた独自のメソッド内からのみスーパーメソッドを呼び出すことができます。
public String someMethod() {
String superResult = super.someMethod();
// go on from here
}
しかし、それはあなたがここで探しているものではありません。あなたはおそらくあなたの方法を次のように変えることができます:
public List<String> getNameAbbreviations() {
//return a list with a single element
}
そして、サブクラスでこれを行います:
public List<String> getNameAbbreviations() {
List fromSuper = super.getNameAbbreviations();
//add the 3 letter variant and return the list
}
それを行うには多くの方法があります。 1つの方法:ThreeNames
のNames#initials()
をオーバーライドしないでください。
もう1つの方法は、Names#initials()
にデリゲートするメソッドをThreeNames
に追加することです。
public class ThreeNames extends Name {
// snip...
public String basicInitials() {
return super.initials();
}
}
代わりに、スーパークラスでイニシャルをそのままにして、完全なイニシャルを返す新しいメソッドを導入します。したがって、コードでは、ThreeNamesのinitialsメソッドの名前を別の名前に変更するだけです。このように、イニシャルメソッドはNameの実装全体で同じです