我之前了解到抽象类可以扩展具体类。虽然我没有从JAVA设计师那里看到它的原因,但它没问题。 我还了解到,扩展具体类的抽象类可以使重写方法成为抽象。为什么?你能提供有用的用例吗?我正在努力学习设计模式,我不想错过任何东西。
以下是示例:
public class Foo
{
public void test()
{
}
}
public abstract class Bar extends Foo
{
@Override
public abstract void test();
}
答案 0 :(得分:16)
如果我有一组我想要test()
的默认实现的类(因此它们可以从Foo
扩展),以及我想要强制的那些类的子集,这将变得有用提供自己的实现(在这种情况下,在子类中将其抽象化将强制执行此操作。)
当然,这个例子中的替代方法是在顶级类而不是子类中声明test()
abstract,这就是你通常所做的 - 但是有些情况下满足的是 - 继承关系意味着从设计的角度来看,它偶尔会更有意义。这种情况很少见,但有时你会看到它。
顺便说一下,虽然是一个特例,但请记住,除非另有说明,否则所有类都会隐式扩展Object
。因此,如果你包含这种情况,那么扩展具体类的抽象类毕竟不是那么不寻常!
答案 1 :(得分:4)
基本上是有选择地重用一些现有的(遗留?)代码。
例如: 假设有人已经创建了具体的C类(当然是完整的实现)。
现在,既然您正在设计一个新系统(具有 抽象类-A )并且您分析了现有系统并发现您将拥有一些方法几乎类似于 concrete-class-C 的方法。但是您还发现具体类-C 的某些方法过于具体,您希望在 抽象类-A <的具体子类中强制执行这些方法。 / EM> 强>
因此,它使您能够选择性地选择要重用的方法和不重用的方法。
答案 2 :(得分:0)
使扩展您的类(使其成为抽象)的类能够提供特定类型的实现。
例如:
答案 3 :(得分:0)
如果你使test
方法摘要,它会强制任何派生自Bar
类的人提供该方法的实现。
如果您从Bar
类中删除抽象方法,则任何派生自Bar
的人都不会拥有来实现test
方法Foo
已经提供了一个(空)实现。