抽象类扩展了具体类

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

这是一个例子:

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

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

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

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

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

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

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

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

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

例如:

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

如果您将test方法设为抽象,则会强制从Bar类派生的任何人提供该方法的实现。

如果从Bar类中删除抽象方法,那么从Bar派生的任何人都不必实现test方法,因为Foo已经提供了一个(空)实现。

当系统发展并且我们不想干扰现有代码时,这种灵活性特别有用。

我能想到的一个简单例子是考虑一个MSDocReader类。 此类是遗留系统的一部分,许多其他应用程序依赖于此。

现在需求发生了变化。 我们必须编写用于读取docx文件,ppt甚至xsl文件的类。

MSDocReader类包含可以重用的方法,例如以KB为单位获取文件的大小,连接到.Net框架(如果我没错:-))

现在使用这个规定,我们可以编写一个absract类AbstractMSFileReader ,它将包含MSDocReader中使用的所有方法。 但是这个类将read方法作为抽象。

原因是我们想强迫开发人员使用他们自己的read方法版本。 (我们不应该使用inheritance,因为inheritance明确指出子类方法将扩展父方法的function。读取doc文件和读取excel文件是两个不同的东西,它们不属于同一层次结构。)

你可能会争辩说我们可以创建一个抽象类并使MSDocReader类扩展该抽象类。 但是可能会发生MSDocReader类可能正在扩展其他类,因为java不支持多inheritance。它可能会产生问题