13

次のクラスがあります。

public abstract class Super
{
    public abstract void run();
}

public class Sub1 extends Super
{
    @Override
    public void run ()
    {
        System.out.println("Method called");
        System.out.println("Sub1 called");
    }
}

public class Sub2 extends Super
{
    @Override
    public void run ()
    {
        System.out.println("Method called");
        System.out.println("Sub2 called");
    }
}

「System.out.println("呼び出されたメソッド");」を記述する必要がないようにするにはどうすればよいですか? 二度?

回答ありがとうございます

キャリバーR.50

4

6 に答える 6

16

共通の機能をスーパークラスに持ち込み、サブクラスが独自の実装を定義する別の抽象メソッドを定義します。

public abstract class Super {
    public void run() {
        System.out.println("Method called");
        printMessage();
    }
    abstract void printMessage ();
}

public class Sub1 extends Super {
    @Override
    void printMessage() {
        System.out.println("Sub1 called");
    }
}

public class Sub2 extends Super {
    @Override
    void printMessage () {
        System.out.println("Sub2 called");
    }
}

このようにして、スーパークラスの共通メソッドを 2 回呼び出すという重複を避けることができます。

于 2013-07-06T19:49:32.083 に答える
4

run() 実装を抽象クラスに入れることができます:

// Super is still an abstract class
public abstract class Super
{
    // While method run is not an abstract method:
    public void run() 
    {
        System.out.println("Method called");
    }
}

public class Sub1 extends Super
{
  // There's no need of declaring run() here unless you want to change its behaviour
}

public class Sub2 extends Super
{
}

質問の編集版では、継承された実行の実現を使用できます

// Super is still abstract
public abstract class Super
{
    // But method run is not abstract
    public void run() 
    {
        System.out.println("Method called");
    }
}

public class Sub1 extends Super
{
  @Override
  public void run()
  {
      super.run(); // <- call Super.run() that prints "Method called"
      System.out.println("Sub1 called");
  }
}

public class Sub2 extends Super
{
  @Override
  public void run()
  {
      super.run();
      System.out.println("Sub2 called");
  }
}
于 2013-07-06T19:44:44.463 に答える
3

「テンプレート メソッド パターン」を使用します。

public class Super
{
    public void template() {
        System.out.println("Method called");
        run();
    }

    public abstract void run();
}

public class Sub1 extends Super
{
    @Override
    public void run () // out called before run
    {

    }
}

public class Sub2 extends Super
{
    @Override
    public void run () // out called before run
    {

    }
}

さらに、実行を保護することができます。

于 2013-07-06T19:55:24.790 に答える
2

共通コードをスーパークラスのメソッドに入れ、サブクラスのメソッドから呼び出すことができます。

public abstract class Super
{
   public abstract void run();
   // code common to both the sub classes implemented
   public void print() {
     System.out.println("Method called");
   }
}

public class Sub1 extends Super
{
   @Override
   public void run ()
   {
     print();
     System.out.println("Sub1 called");
     // sub class specific code here
   }
}

public class Sub2 extends Super
{
   @Override
   public void run ()
   {
      print();
      System.out.println("Sub2 called");
      // sub class specific code here
   }
}
于 2013-07-06T19:48:42.323 に答える
1

すべてのサブクラスに同一の動作を持たせたい場合は、サブクラスがそれを継承できるように、スーパークラスのみでメソッドをコーディングするのが正しいテクニックです。ただし、この場合、唯一のメソッドを実装するため、スーパークラスを抽象化する必要がなくなります。

于 2013-07-06T19:44:23.180 に答える