【问题标题】:Calling method from child classes having same name - java从具有相同名称的子类调用方法 - java
【发布时间】:2014-03-18 01:13:00
【问题描述】:

我有一个包含 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。我该怎么做?

【问题讨论】:

  • 如果您确切知道要调用哪个方法,那么继承可能是不适合这项工作的工具。只需将它们全部移至 A,并给它们起不同的名称。

标签: java inheritance parent-child parent


【解决方案1】:

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

调用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

【讨论】:

    【解决方案2】:
    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()"
    

    【讨论】:

      【解决方案3】:
      1. 您尝试执行的操作无法使用继承来实现。父母永远不会知道子类是什么。
      2. 您可以尝试使用组合而不是继承。你可以阅读关于作文here

      你想要的快速而肮脏的实现:

      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();
        }
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 2022-10-06
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 2014-11-27
        • 1970-01-01
        相关资源
        最近更新 更多