Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类实现接口,接口方法的实现能否确定扩展抽象超类的子类?_Java_Interface - Fatal编程技术网

Java 抽象类实现接口,接口方法的实现能否确定扩展抽象超类的子类?

Java 抽象类实现接口,接口方法的实现能否确定扩展抽象超类的子类?,java,interface,Java,Interface,给定一个接口: public interface GoAlgorithm { public void go(); } public class GoByFlyingFast implements GoAlgorithm { public void go() { System.out.println("Now I'm flying FAAAAST. Woo-hoo!"); } } 实现接口的类: public interface GoAlgorithm { publ

给定一个接口:

public interface GoAlgorithm
{
  public void go();
}
public class GoByFlyingFast implements GoAlgorithm
{
  public void go()
  {
    System.out.println("Now I'm flying FAAAAST. Woo-hoo!");
  }
}
实现接口的类:

public interface GoAlgorithm
{
  public void go();
}
public class GoByFlyingFast implements GoAlgorithm
{
  public void go()
  {
    System.out.println("Now I'm flying FAAAAST. Woo-hoo!");
  }
}
抽象类

public abstract class Vehicle
{
  private GoAlgorithm goAlgorithm;

  public Vehicle()
  {
    System.out.printf("A new vehicle has entered the race! \n");
  }

  public void setGoAlgorithm(GoAlgorithm algorithm)
  {
    this.goAlgorithm = algorithm;
  }

  public void go()
  {
    this.goAlgorithm.go();
  }
}
扩展抽象类的类:

public class Tomcat extends Vehicle
{
  public Tomcat()
  {
    setGoAlgorithm(new GoByFlyingFast());
  }
}
(来自假人设计模式的代码示例)

在接口方法的抽象类实现中,是否有方法确定调用接口方法的对象的子类

go()能否确定Tomcat对象是否正在调用Vehicle类定义的go()方法

如果已经提出了这个问题,请道歉。正如这个问题的标题所证明的,我正在努力简洁地表达我的问题

谢谢大家!


编辑:纯粹的好奇问题理论上是的。您可以使用
Thread.getStackTrace()
获取当前堆栈跟踪,分析它并查看调用者的动态类。然而,这将是非常糟糕的设计

或者,您可以让您的子类实现一个
getName()
函数,该函数返回它们的类名,以便您可以在超类中访问它们


在任何情况下,如果您的(抽象)类不根据子类化它们的类来更改它们的行为,那么这是一个好的设计。因此不需要获取此类信息。

go()是否可以确定Tomcat对象是否正在调用Vehicle类定义的go()方法?在这种设计中,不,这是不可能的。“go()能确定Tomcat对象是否调用Vehicle类定义的go()方法吗?”首先,你为什么想知道?谢谢你的输入。我同意没有必要,但我有无可救药的好奇心;更感兴趣的是“是否有可能”,无论它多么丑陋或无用。我来看看线程。@IdusOrtus最好在接口中添加一个setter方法来指定此接口的客户端,这样就可以在其构造函数中设置使用该接口的类的当前实例,如
Tomcat
。但是请注意,这是一个丑陋的设计(没有
线程#getStackTrace
用法那么糟糕),应该避免,因为它会生成类耦合。这相当于我建议的getter方法。你不会使用getter方法,而是一个字段,同样的原理。再次感谢你的输入!我知道你的建议会满足我的要求,我同意你的看法:设计糟糕,耦合增加,任何解决方案都很难看。所以没有办法一般地或动态地这样做?类似于动态查找的东西?@IdusOrtus不,没有。不应该有办法。为什么您想知道哪一个客户端使用您接口的精确实现作为开始?