1

让我们假设我们有一个像这样的抽象类:

public abstract class Foo {
  public Foo (boolean bar) {...}
}

我们还有一个扩展类Foo

public class FooThread extends Foo {}

顾名思义,FooThread将是一个线程,因此应该实现 Runnable。

implements Runnable问题是:就可扩展性和可读性(或任何其他原因)而言,最佳位置是什么?

一些替代方案可能是:

1)插入implements抽象类:

public abstract class Foo implements Runnable {}
  • 看抽象类时容易理解
  • 扩展性较差

2)插入implements扩展类:

public class FooThread extends Foo implements Runnable {}
  • 抽象类中没有关于线程功能的提示
  • 更具扩展性

3) 插入implements扩展类并run()作为抽象方法添加到抽象类:

public class FooThread extends Foo implements Runnable {}

public abstract class Foo {
  public Foo (boolean bar) {...}
  public abstract void run();
}
  • 查看抽象类时的可读性
  • 可扩展(嗯,至少更灵活一点)
  • 抽象类中的抽象方法有点多余
  • “丑陋的”

是否有放置implements Runnableimplements Xyz一般的最佳做法?最早还是在真正实现接口的类中?还是真的取决于我们想要什么?你更喜欢什么?

谢谢您的意见!

4

3 回答 3

2

你把它放在第一位,它就变成了一个要求Runnable如果不需要,不要强迫事情发生。如果需要Runnable则添加接口。

因此,在这种情况下,我会为您的选项(2)提供支持:放在implements Runnable类上FooThread而不是Foo抽象类上,除非所有子类Foo都必须作为线程运行(但它的名称并不暗示这种情况) .

同样,您不需要public abstract void run()根据您的选项 (3) 添加 ,除非所有Foo实现都必须具有该方法;如果是这种情况,您可以Runnable根据您的选项 (1) 简单地实施。

我同意 Torben 的观点,FooThread最好将其命名为FooTask. 不仅因为 Runnable 不是 Thread(Thread 是 Runnable,但反之亦然),还因为“Task”这个词更面向业务领域(更高级别的抽象)。

于 2013-11-01T10:00:33.833 回答
1

如果抽象类的所有实例都应该用作可运行任务,则使抽象类实现 Runnable 接口。

否则不要执行。

于 2013-11-01T10:00:58.570 回答
1

我会说这取决于谁将成为可运行对象:

  • 整个层次结构 -> 抽象类
  • 只有一些实现 -> 只有需要的实现

关于implements xyz问题是类似的:

  • 它们是否有共同点,您可以将它们放在基础抽象类中->抽象类+模板方法中
  • 他们都必须实现那个确切的功能,并且在每个 -> 抽象类中都是完全不同的
  • 只有其中一些 -> 只需要
于 2013-11-01T10:02:58.997 回答