抽象类扩展了具体类
我之前了解到抽象类可以扩展具体类。 虽然我没有从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。它可能会产生问题