抽象类扩展了具体类

时间:2014-01-07 11:54:54

标签: java design-patterns

我之前了解到抽象类可以扩展具体类。虽然我没有从JAVA设计师那里看到它的原因,但它没问题。 我还了解到,扩展具体类的抽象类可以使重写方法成为抽象。为什么?你能提供有用的用例吗?我正在努力学习设计模式,我不想错过任何东西。

以下是示例:

public class Foo 
{
    public void test()
    {
    }
}

public abstract class Bar extends Foo
{
   @Override
   public abstract void test();
}

4 个答案:

答案 0 :(得分:16)

如果我有一组我想要test()的默认实现的类(因此它们可以从Foo扩展),以及我想要强制的那些类的子集,这将变得有用提供自己的实现(在这种情况下,在子类中将其抽象化将强制执行此操作。)

当然,这个例子中的替代方法是在顶级类而不是子类中声明test() abstract,这就是你通常所做的 - 但是有些情况下满足的是 - 继承关系意味着从设计的角度来看,它偶尔会更有意义。这种情况很少见,但有时你会看到它。

顺便说一下,虽然是一个特例,但请记住,除非另有说明,否则所有类都会隐式扩展Object。因此,如果你包含这种情况,那么扩展具体类的抽象类毕竟不是那么不寻常!

答案 1 :(得分:4)

基本上是有选择地重用一些现有的(遗留?)代码。

例如: 假设有人已经创建了具体的C类(当然是完整的实现)。

现在,既然您正在设计一个新系统(具有 抽象类-A )并且您分析了现有系统并发现您将拥有一些方法几乎类似于 concrete-class-C 的方法。但是您还发现具体类-C 的某些方法过于具体,您希望在 抽象类-A <的具体子类中强制执行这些方法。 / EM>

因此,它使您能够选择性地选择要重用的方法和不重用的方法。

答案 2 :(得分:0)

使扩展您的类(使其成为抽象)的类能够提供特定类型的实现。

例如:

  • 抽象ClassA
  • ClassB扩展ClassB - 提供ClassA
  • 中定义的抽象方法的特定实现

答案 3 :(得分:0)

如果你使test方法摘要,它会强制任何派生自Bar类的人提供该方法的实现。

如果您从Bar类中删除抽象方法,则任何派生自Bar的人都不会拥有来实现test方法Foo已经提供了一个(空)实现。