【问题标题】:Is there a way to tell which child class called a parent's function in java?有没有办法告诉java中哪个子类调用了父函数?
【发布时间】:2021-03-23 01:43:56
【问题描述】:

我有两个扩展同一个类的类,例如:

abstract class A {
//functions
}
class B extends A {
//functions
}
class C extends A {
//functions
}

我希望父类中的函数根据调用该函数的子类来更改其行为,例如,A 类中的函数将根据哪个子类调用该函数来执行不同的 if 语句。有没有办法让父类知道哪个子构造函数正在使用它的函数?

【问题讨论】:

  • this.getClass()
  • 另一种选择是使用instanceof: if (this instanceof B) {}
  • 如果我不得不做这样的事情,我可能会重新考虑我的设计。否则,当您将来需要对父级进行子类化时,您可能会遇到问题。用子类的要求简单地覆盖子类中的方法不是更好吗?
  • 正是如此。这种技术被称为“状态导向”,在 1960 年代被当作糟糕的实践而被抛弃。

标签: java inheritance parent-child


【解决方案1】:

没问题,给你:

abstract class A {
// abstract functions
public void myCoolFunction(){
    if(this.getClass().equals(B.class)){
      System.out.println("B!");
    }else{
      System.out.println("NOT B!");
    }
  }
}

class B extends A {
//functions
}

class C extends A {
//functions
}

测试它:

jshell> C c = new C();
c ==> C@6d4b1c02

jshell> c.myCoolFunction();
NOT B!

jshell> B b = new B();
b ==> B@4883b407

jshell> b.myCoolFunction();
B!

顺便说一句,这种技术通常是code smell 或糟糕的设计。

【讨论】:

  • 或演示,只需System.out.println(this.getClass().getSimpleName());
  • 顺便说一句,恕我直言,这是非常糟糕的设计。我希望这只是出于好奇,而不是用于实际使用。
  • 同意。添加了最后的注释以使其清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多