1

サブクラスでスーパークラスのメソッドをオーバーライドしたい。しかし、プログラムにどんな変更を加えても。スーパークラスのメソッドによって進められた結果をまだ示しています。では、私のコードの何が問題なのですか?

getChildAge メソッドと getGreeting メソッドをオーバーライドしたい。オーバーライド後に 14 (12 が設定されている場合) を表示する必要があります。これは単に実際の年齢に 2 を加えた値を報告するだけです。getGreeting メソッドに渡された引数に関係なく。

これが私のコードです:

public class SchoolKid
{
private String childName;
private int childAge;
private String childTeacher;
private String greeting;

//Constructor sets the childName,age,childTeacher and greeting.
public SchoolKid(String childN,int a,String childT,String g)
{
    childName = childN;
    childAge = a;
    childTeacher = childT;
    greeting = g;
}

public void setChildName(String childN)
{
    childName = childN; 
}

public void setChildAge(int a)
{
    childAge = a;
}

public void setChildTeacher(String childT)
{
    childTeacher = childT;  
}

public void setGreeting(String g)
{
    greeting = g;   
}

public String getChildName()
{
    return childName;
}

public int getChildAge()
{
    return childAge;
}

public String getChildTeacher()
{
    return childTeacher;
}

public String getGreeting()
{
    return greeting;
}
}

public class ExaggeratingKid extends SchoolKid
{
private int childAge;
private String greeting;


//Constructor sets the child name,age,childTeacher and greeting.
public ExaggeratingKid(String childNAME,int childAGE,
                       String childTEACHER,String GREETING)
{
    super(childNAME,childAGE,childTEACHER,GREETING);
    }

public void setChildAge(int a)
{
    childAge = a;
    super.setChildAge(childAge+2);
}

public void setGreeting(String g)
{
    greeting = "I am the best.";
    super.setGreeting("I am the best."); 
}

public String toString()
{
    String str;
    str = "The child's name is "+super.getChildName()+
          "\nThe child's age is "+super.getChildAge()+
          "\nThe child's teacher is "+super.getChildTeacher()+
          "\nThe greeting is: "+super.getGreeting();
    return str;
}
}
4

2 に答える 2

4

スーパーメソッドを呼び出す場合、オーバーライドに何のメリットがありますか? superでメソッドを呼び出さないでくださいtoString()。現在のオブジェクトであるオブジェクトのメソッドを呼び出しthisます。また、子供に挨拶や childAge フィールドを与えないでください。

たとえば、これは意味がありません。

public void setChildAge(int a)
{
    childAge = a;
    super.setChildAge(childAge+2);
}

代わりに次のようにします。

@Override
public void setChildAge(int a)
{
    // childAge = a; // the child shouldn't have this variable
    super.setChildAge(a + 2);
}

同様に、これは良くありません:

public void setGreeting(String g)
{
    greeting = "I am the best.";
    super.setGreeting("I am the best."); 
}

代わりに、次のようにします。

@Override
public void setGreeting(String g)
{
    // but what is g for???
    // greeting = "I am the best.";
    super.setGreeting("I am the best."); 
}

またはおそらくより良い:

@Override
public String getGreeting() {
  return "I am the best.";
}

子クラスの greeting フィールドと childAge フィールドを削除します。ただし、これを行う場合は、子のコンストラクターでこれを呼び出して、挨拶が設定されていることを確認する必要があります。

于 2013-07-10T01:58:05.000 に答える
1

これがあなたの問題です

public String toString()
{
    String str;
    str = "The child's name is "+super.getChildName()+
          "\nThe child's age is "+super.getChildAge()+
          "\nThe child's teacher is "+super.getChildTeacher()+
          "\nThe greeting is: "+super.getGreeting();
    return str;
}

superメンバーを使用するたびに。superこのメソッドからキーワードを削除するだけです

public String toString()
{
    String str;
    str = "The child's name is "+ getChildName()+
          "\nThe child's age is "+ getChildAge()+
          "\nThe child's teacher is "+ getChildTeacher()+
          "\nThe greeting is: "+ getGreeting();
    return str;
}
于 2013-07-10T01:58:00.600 に答える