从具有相同名称的子类调用方法 - java

时间:2014-03-18 01:13:01

标签: java inheritance parent-child parent

我有一个包含1个父类和多个子类的程序。所有子类具有相同的方法名称但执行不同的功能。我希望能够从特定的类中调用该方法。例如

class A
{
 public void doABC()
  { 
    //do something; 
    //call Class B's method didABC; 
    //call Class C's method didABC }
}

class B extends A
{
  public void didABC()
  {
    //does something;
  }
}

class C extends A
{
  public void didABC()
  {
    //does something;
  }
}

我希望能够在我想要的时候致电B级didABC和C级didABC。我该怎么做?

3 个答案:

答案 0 :(得分:4)

只需创建子类的实例并在其上调用方法。

致电B级的didABC:

B b = new B();
b.didABC();

致电C级的didABC:

C c = new C();
c.didABC();

您可以在父类引用中保存子类的对象,也可以使用该引用调用方法。无论父类将保留哪个类对象,它都将简单地调用该类方法。

A a = new A();
a.didABC(); // class A method will be called
a = new B();
a.didABC(); // class B method will be called
a = new C();
a.didABC(); // class C method will be called

答案 1 :(得分:1)

public abstract class A
{
    public void doABC() { didABC(); }
    public abstract void didABC();
}

class B extends A
{
    public void didABC() { System.out.println("B::didABC()"); }
}

class C extends A
{
    public void didABC() { System.out.println("C::didABC()"); }
}

现在你可以这样做

A b = new B();
b.doABC(); // Prints "B::didABC()"

A c = new C();
c.doABC(); // Prints "C::didABC()"

如果你不希望A类是抽象的,你也可以这样做

public class A
{
    public void doABC() { didABC(); }
    public void didABC() { System.out.println("A::didABC()"); }
}

现在你也可以这样做

A a = new A();
a.doABC(); // Prints "A::didABC()"

答案 2 :(得分:0)

  1. 使用继承无法实现您要做的事情。父母将来也不应该知道什么是子类。
  2. 您可以尝试使用Composition而不是继承。您可以阅读有关撰写here
  3. 的内容

    快速而又脏的实现你想要的东西:

    interface DoAbc {
      public void doAbc();
    }
    
    class B implements DoAbc {
      public void doAbc() {
        //B's implementation
      }
    }
    
    class C implements DoAbc {
      public void doAbc() {
        //C's implementation
      }
    }
    
    class A implements DoAbc {
      DoAbc b,c;
      A(DoAbc b, DoAbc c) {
        this.b=b;
        this.c=c;
      }
      public void doAbc() {
      //A's implementation
        b.doAbc();
        c.doAbc();
      }
    }
    

    对于纳粹的任何设计模式,我知道它不是复合设计模式的正确实现。对于他想在问题中实现的目标,它只是一个快速而肮脏的实现。