4

テストクラスに含まれるコードを正しく実行できるように、継承を使用しようとしています。goPee() メソッドを備えたバスルームと呼ばれる抽象クラスまたはインターフェースを実装する方法がわかりません。コーディングする方法を知っていますか?

抽象クラスまたはインターフェイスのいずれかを追加し、それぞれ extends または implements を介して Human クラスに追加すると、常に goPee() メソッドの Human クラスに実装を記述するように求められますが、これはやりたくありません。私の goPee() メソッドの実装は、Male および Female 子クラスに記述されています。

import java.util.ArrayList;

class Human
{
  private String name;
  public Human (String name)
  {
    this.name = name;
  }
  public String getName()
  {
    return name;
  }
  public void eat()
  {
    System.out.println(name + " went to fridge.");
  }
}

class Male extends Human
{
  public Male(String name)
  {
    super(name);
  }
  public void goPee()
  {
    System.out.println(getName() + " stood up.");
  }
}

class Female extends Human
{
  public Female(String name)
  {
    super(name);
  }
  public void goPee()
  {
    System.out.println(getName() + " sat down.");
  }
}

public class TestHuman
{
  public static void main(String[] args)
  {
    ArrayList<Human> arr = new ArrayList<Human>();
    arr.add(new Male("john"));
    arr.add(new Female("sally"));
    for (int count = 0; count < arr.size(); count++)
    {
      arr.get(count).eat();
      arr.get(count).goPee();
    }
  }
}
4

3 に答える 3

7

goPee()Human クラスでメソッドを定義する必要があります。両方のサブクラスでオーバーライドしているため、抽象メソッドにすることができます。これは、人間が抽象的でなければならないことも意味します。

abstract class Human
{
  private String name;
  public Human (String name)
  {
    this.name = name;
  }
  public String getName()
  {
    return name;
      }
  public void eat()
  {
    System.out.println(name + " went to fridge.");
  }
  public abstract void goPee();
}

Human で抽象メソッドを宣言すると、Human のすべてのサブクラスがgoPee()同じパラメーターと戻り値の型でメソッドを実装することが保証されます。goPee()これにより、両方が実装されていることがわかっているため、男性か女性かを知らなくても人間を呼び出すことができます。

于 2012-04-26T01:36:14.493 に答える
5

サブクラスのメソッドをポリモーフィックに呼び出せるようにするには、基本クラスで同じシグネチャを持つメソッドを定義する必要があります。

abstract class Human {
    public abstract void goPee();
}

クラスを抽象化する必要はありませんが、性別のない人間は存在しないため、この場合は抽象化することが理にかなっています。ただし、派生クラスのメソッド間で一部の実装を共有したい場合は、基本クラスの実装に共通のコードを配置できます。

class Human {
    public void goPee() {
        System.out.println(getName() + " lifted the cover.");
    }
}

class Male extends Human {
    public void goPee() {
        super.goPee();
        System.out.println(getName() + " stood up.");
    }
}

class Female extends Human {
    public void goPee() {
        super.goPee();
        System.out.println(getName() + " sat down.");
    }
}
于 2012-04-26T01:36:13.920 に答える
0

あなたの根本的な問題は、存在しない人間の参照でメソッドを呼び出そうとしていることです。

オブジェクトを男性または女性オブジェクトに正しくキャストすると、メソッドを呼び出すことができることがわかります。コンテナーは基底クラスしか認識していないため、そこでメソッドを定義する必要があります。そうすれば、ポリモーフィズムは Human 参照に関連付けられた型で正しい定義を呼び出します。(つまり、男性または女性のオブジェクト)

于 2012-04-26T01:39:37.953 に答える