抽象类扩展具体类

问题描述 投票:0回答:6

我之前了解到抽象类可以扩展具体类。虽然我没有从 Java 设计者那里看到原因,但没关系。

我还了解到,扩展具体类的抽象类可以使重写的方法变得抽象。为什么?是否有一个有用的用例?我正在努力学习设计模式,我不想错过任何东西。

这是示例:

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

public abstract class Bar extends Foo
{
   @Override
   public abstract void test();
}
java design-patterns
6个回答
23
投票

如果我有一组想要默认实现

test()
的类(以便它们可以从
Foo
扩展),以及我想要强制提供自己的实现的这些类的子集(在这种情况下,在子类中使其抽象将强制执行此操作。)

当然,这个例子中的另一种方法是在顶级类而不是子类中声明

test()
抽象,这就是你通常会做的 - 但在某些情况下,满足 is-a 关系继承意味着从设计的角度来看,这样做有时会更有意义。这种情况很少见,但有时确实会看到。

顺便说一句,虽然是一种特殊情况,但请记住,除非另有说明,否则所有类都会隐式扩展

Object
。因此,如果包括这种情况,扩展具体类的抽象类毕竟并不是那么不寻常!


5
投票

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

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

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

因此,它使您能够有选择地选择重复使用哪些方法和不重复使用哪些方法。


1
投票

使扩展类(抽象化)的类提供特定类型的实现。

例如:

  • 抽象A类
  • ClassB 扩展 ClassB - 提供 ClassA 中定义的抽象方法的具体实现

0
投票

如果将

test
方法抽象化,它会强制从
Bar
类派生的任何人提供该方法的实现。

如果从

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


0
投票

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

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

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

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

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

原因是我们想强制开发人员使用他们自己版本的 read 方法。 (我们不应该使用继承,因为继承明确指出 子类方法将扩展父类方法的功能。读取 doc 文件和读取 excel 文件是两件不同的事情,它们不属于 相同的层次结构。 )

您可能会争辩说,我们可以创建一个抽象类,并使 MSDocReader 类扩展该抽象类。但有可能发生的是 MSDocReader类可能会扩展其他一些类,并且由于java不支持多重继承,它可能会产生问题


0
投票

对象类是类层次结构的根。

  • 每个类(也包括抽象类)都有 Object 作为超类。所有对象,包括数组,都实现该类的方法。
© www.soinside.com 2019 - 2024. All rights reserved.