我之前了解到抽象类可以扩展具体类。虽然我没有从 Java 设计者那里看到原因,但没关系。
我还了解到,扩展具体类的抽象类可以使重写的方法变得抽象。为什么?是否有一个有用的用例?我正在努力学习设计模式,我不想错过任何东西。
这是示例:
public class Foo
{
public void test()
{
}
}
public abstract class Bar extends Foo
{
@Override
public abstract void test();
}
如果我有一组想要默认实现
test()
的类(以便它们可以从 Foo
扩展),以及我想要强制提供自己的实现的这些类的子集(在这种情况下,在子类中使其抽象将强制执行此操作。)
当然,这个例子中的另一种方法是在顶级类而不是子类中声明
test()
抽象,这就是你通常会做的 - 但在某些情况下,满足 is-a 关系继承意味着从设计的角度来看,这样做有时会更有意义。这种情况很少见,但有时确实会看到。
顺便说一句,虽然是一种特殊情况,但请记住,除非另有说明,否则所有类都会隐式扩展
Object
。因此,如果包括这种情况,扩展具体类的抽象类毕竟并不是那么不寻常!
基本上是有选择地重用一些现有的(遗留的?)代码。
例如: 假设有人已经创建了一个concrete-class-C(当然是完整的实现)。
现在,由于您正在设计一个新系统(具有抽象类-A)并且您分析了现有系统,发现您将拥有一些与具体方法几乎相似的方法- C 级。但是您还发现具体类-C的某些方法过于具体,并且您希望在抽象类-A的具体子类中强制实现这些方法。
因此,它使您能够有选择地选择重复使用哪些方法和不重复使用哪些方法。
使扩展类(抽象化)的类提供特定类型的实现。
例如:
如果将
test
方法抽象化,它会强制从 Bar
类派生的任何人提供该方法的实现。
如果从
Bar
类中删除抽象方法,那么从 Bar
派生的任何人都不会 have 实现 test
方法,因为 Foo
已经提供了一个(空)实现。
当系统不断发展并且我们不想干扰现有代码时,这种灵活性特别有用。
我能想到的一个简单的例子是考虑一个 MSDocReader 类。该类是遗留系统的一部分,许多其他应用程序都依赖于此。
现在要求发生了变化。我们必须编写用于读取 docx 文件、ppt 甚至 xsl 文件的类。
MSDocReader 类包含可重用的方法,例如获取文件大小(以 KB 为单位)、连接到 .Net 框架(如果我没记错的话:-))
现在使用此规定,我们可以编写一个抽象类 AbstractMSFileReader ,它将包含 MSDocReader 中使用的所有方法。但是这个类将 read 方法作为抽象方法。
原因是我们想强制开发人员使用他们自己版本的 read 方法。 (我们不应该使用继承,因为继承明确指出 子类方法将扩展父类方法的功能。读取 doc 文件和读取 excel 文件是两件不同的事情,它们不属于 相同的层次结构。 )
您可能会争辩说,我们可以创建一个抽象类,并使 MSDocReader 类扩展该抽象类。但有可能发生的是 MSDocReader类可能会扩展其他一些类,并且由于java不支持多重继承,它可能会产生问题
对象类是类层次结构的根。