`
student_lp
  • 浏览: 436631 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

      在java中有两种类:一种是具体类,另一种是抽象类。具体类可以实例化,抽象类不可以实例化。

一、什么是抽象类

      抽象类仅提供一个类型的部分实现。抽象类可以有实例变量,以及一个或多个构造函数。抽象类可以同时有抽象方法和具体方法。

      一个抽象类不会有实例,这些构造函数不能被客户端调用来实例化抽象类。一个抽象类的构造函数被其子类调用,从而使一个抽象类的所有子类都可以有一些共有的实现,而不同的子类可以在此基础上有其自己的实现。

      java抽象类和接口一样,都用来声明一个新的类型,并且作为一个类型的等级结构的起点。但是,java接口具有比抽象类更好的特性,因此,应当优先使用接口声明一个超类型。

二、抽象类的用途

     抽象类通常代表了一个抽象概念,他提供了继承的出发点。而具体类则不同,具体类可以实例化,应当给出一个有商业逻辑实现的对象模板。由于抽象类不可以实例化,因此一个设计师设计一个新的抽象类,一定是用来继承的。而这个声明倒过来也是对的:具体类不是用来继承的,只要有可能,不要从具体类继承。

1、代码重构的建议

      如果在一个原始的设计里,有两个具体类之间有继承关系,那么最可能的修改方案是怎样呢?

      假设有两个具体类,类A和类B,类B是类A的子类,那么一个最简单的修改方案应当是建立一个抽象类(或接口)C,然后让类A和类B成为抽象类C的子类。其实在这个例子中,包含更广泛的意义,这就是里氏代换原则。会在里氏代换原则那里详解。

2、抽象类应当拥有尽可能多的共同代码

      在一个从抽象类到多个具体类的继承关系中,共同的代码应当尽量移动到抽象类里。在一个继承的等级结构中,共同的代码应当尽量向等级结构的上方移动,这样可以提升代码的复用率。这样如果代码发生改变,设计师只需要修改超类,而子类无须修改。

     一个对象从超类继承而来的代码,在不使用时不会造成对资源的浪费。因此应当尽可能把子类中拥有的共同特征代码上移到超类中,这样可以保证最大限度的复用。一个典型的例子就是策略模式,在策略模式中,抽象类角色的分量越重越好,也就是说尽可能将公共的方法移动到抽象策略角色中。

3、抽象类应当拥有尽可能少的数据

      与代码的移动方向相反的是,数据的移动方向是从抽象类到具体类,也即从继承的等级结构的高端向低等级结构的低端移动。这是因为一个对象的数据不论是否使用都会占用资源,因此数据应当尽量放到具体类或者等级结构的低端。因此在前面的例子中,我们应该将类A和类B的数据保持在各自的类中,而不是移动到抽象超类C里面,这样可以保证节省内存资源。

三、在什么时候使用继承复用

      继承代表“一般化/特殊化”关系,其中基类代表一般,而衍生类代表特殊,衍生类将基类特殊化和扩展化,当满足下面条件时,才应当使用继承关系:

     ①子类是超类的一个特殊类,而不是超类的一个角色,也就是要区分“Has-A”和“Is-A”两种关系的不同。Has-A关系应当使用聚合关系描述,而只有Is-A关系才符合继承关系。

     ②永远不会出现需要将子类转换成另一个子类的情况。如果我们不是很肯定一个类会不会再将来变成另一个类的子类的话,就不应当将这个类设计成当前这个超类的子类。

     ③子类具有扩展超类的责任,而不是具有置换掉(Override)或注销掉(Nullify)超类的责任。如果子类需要将大量的置换掉超类的行为,那么这个子类不应当成为这个超类的子类。

     ④只有在分类学角度有意义时,才可以使用继承,不要从工具类继承。

 

本文通过总结《java与模式》而来。

分享到:
评论

相关推荐

    C++设计模式-基于QT4开源跨平台开发框架 源码

    设计模式分为三大类:创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如代理、装饰器、适配器)和行为型模式(如观察者、策略、命令)。这些模式都是在特定上下文中解决设计问题的模板,它们可以提高代码的...

    Delphi模式编程

    《Delphi模式编程》是关于软件开发中的一种高效方法论,它主要借鉴并应用了设计模式这一概念。设计模式是经过反复验证、在特定场景下解决问题的通用解决方案,它们是软件工程领域中的宝贵经验总结。通过学习和运用...

    c#开发模式-面向对象

    **Strategy模式**的主要目的是将一组相关的算法封装在一个接口或抽象类中,允许用户在运行时根据需要动态地选择合适的算法。这种模式的关键在于将算法的选择与使用算法的对象分离,从而提高了系统的灵活性。 #### ...

    c++设计模式精解-GoF 23种设计模式解析附C++实现源码

    设计模式是面向对象编程领域的重要组成部分,它提供了一系列解决常见问题的方法论。本文旨在深入解析GoF(Gang of Four)所提出的23种设计模式,并附带C++实现的源码示例。 #### 1. 创建型模式 ##### 1.1 Factory...

    软件模式的现状-论文.zip

    在面向对象编程中,软件模式如工厂模式、观察者模式等,为解决类的创建、对象之间的交互等问题提供了标准解决方案。然而,随着函数式编程的兴起,一些模式如策略模式、装饰器模式等在函数式编程中找到了新的实现方式...

    从战略角度对Java抽象类与接口的剖析.pdf

    而抽象类与接口作为Java语言中用于实现面向对象编程原则的关键组件,对于构建稳健、可扩展、易维护的软件系统至关重要。本文通过战略角度对Java抽象类与接口进行深入剖析,力图揭示其在软件设计中的核心作用以及如何...

    论设计模式的重要性-《重学设计模式》

    在面向对象编程中,接口和抽象类是实现解耦合的重要工具。接口是一种规范,代表对象必须遵循的约定,一个类可以实现多个接口,确保其具有接口定义的所有方法。抽象类则是一种未完成的类,它可以包含抽象方法和非抽象...

    设计模式design-pattern-java.pdf

    通过类比武术中的“招式”和“内功”,帮助读者理解设计模式不仅是一种编程技巧,更是一种思考问题的方法论。它强调了设计模式是提升软件质量和效率的关键所在。 ### 二、面向对象设计原则 面向对象设计原则是一组...

    Java设计模式 图解 附代码

    - **Abstraction**:定义抽象类的接口。 - **RefinedAbstraction**:扩展Abstraction,使其具有特定的行为。 - **Implementor**:定义实现类的接口。 - **ConcreteImplementor**:实现Implementor接口。 ##### ...

    C#面向对象设计模式纵横谈-创建型模式

    在编程领域,面向对象设计模式是一种经过验证的解决常见问题的方法论,它们是软件开发中的最佳实践。创建型设计模式是面向对象设计模式的一种类型,主要关注对象的创建过程,旨在提供灵活、可扩展和易于管理的对象...

    Java设计模式学期论文

    **抽象工厂模式**:提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它适用于需要创建一组相关的对象,但具体的实现可能因环境而异的情况。 - **结构**:包括抽象工厂类、具体工厂类、产品...

    南京理工大学Java面向对象编程作业源码

    面向对象编程(Object-Oriented Programming,OOP)是现代软件开发中的重要方法论,它以对象作为基本的组织单元,通过封装、继承和多态等特性来构建可复用、易维护的代码结构。 在Java中,面向对象编程体现在以下几...

    设计模式英文版-Design Pattern Explained

    3. **抽象工厂模式**:提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。 4. **建造者模式**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 5. **原型模式*...

    设计模式培训-strategy.pdf

    设计模式作为软件工程领域的重要组成部分,是解决特定问题的有效方法论。设计模式的本质在于将实践中遇到的常见问题进行抽象,提炼出可复用的解决方案,从而避免重复造轮子,提高软件的开发效率和质量。正如《建筑的...

Global site tag (gtag.js) - Google Analytics