抽象类扩展了具体类

Hei*_*erg 27 java design-patterns

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

这是一个例子:

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

public abstract class Bar extends Foo
{
   @Override
   public abstract void test();
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*rry 16

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

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

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

  • 只是分享一下我的经验。最近,我在尝试重用另一个产品的一个产品功能时遇到了这种情况。我需要从重用的产品中扩展一个具体的类,并且有两种类型的方法:一种与产品重用组件无关,另一种需要特定于重用产品的实现。因此,从设计的角度来看,为第一种方法提供实现并为第二种方法提供抽象的抽象类是有意义的。请注意,这只是收敛我们的组件的第一步,因此它可能会发生变化。 (2认同)

Jan*_*ram 5

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

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

现在,由于您正在设计一个新系统(它有一个抽象类 A)并且您分析了现有系统并发现您将拥有一些与具体类 C的方法几乎相似的方法。但是您还发现具体类 C 的某些方法过于具体,您希望在抽象类 A的具体子类中强制实现这些方法。

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