【问题标题】:Abstract class implements interface, can implementation of interface method determine subclass extending abstract super class?抽象类实现接口,接口方法的实现可以决定子类扩展抽象超类吗?
【发布时间】:2014-06-05 01:17:51
【问题描述】:

给定一个接口:

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() 方法?

如果这个问题已经被提出,我们深表歉意。正如这个问题的标题所证明的那样,我很难简明扼要地表达我的问题。

谢谢!

编辑:纯粹的好奇问题

【问题讨论】:

  • go() 是否可以确定 Tomcat 对象是否正在调用 Vehicle 类定义的 go() 方法? 使用这种设计,不,这是不可能的。
  • “go() 是否可以确定 Tomcat 对象是否正在调用 Vehicle 类定义的 go() 方法?”首先,你为什么想知道这个?

标签: java interface


【解决方案1】:

理论上是的。您可以使用Thread.getStackTrace() 获取当前堆栈跟踪,对其进行分析并查看调用者的动态类。但是,这将是非常糟糕的设计。

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

在任何情况下,如果您的(抽象)类不根据哪个类继承它们而改变它们的行为,那么这是一个很好的设计。所以应该不需要获取这些信息。

【讨论】:

  • 感谢您的意见。我同意没有必要,但我很好奇;对“是否可能”更感兴趣,无论多么丑陋或无用。我来看看线程。
  • @IdusOrtus 最好在你的接口中添加一个setter方法来指定这个接口的客户端,这样你就可以设置使用该接口的类的当前实例,比如Tomcat在它的构造函数中。但请注意,这是一个丑陋的设计(不像Thread#getStackTrace 的用法那么糟糕),应该避免由于产生类耦合。
  • 这相当于我建议的getter方法。您不会使用 getter 方法,而是使用字段,原理相同。
  • 再次感谢您的意见!我看到您的建议将满足我的要求,并同意:糟糕的设计,增加耦合,任何解决方案都可能很丑陋。所以没有办法通用或动态地做到这一点?类似于动态查找的东西?
  • @IdusOrtus 不,没有。而且不应该有办法。为什么你想知道哪个客户端使用你的接口的精确实现?
猜你喜欢
  • 2012-07-17
  • 2012-10-08
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2011-09-16
  • 2011-11-20
相关资源
最近更新 更多