`
huaxin803
  • 浏览: 109190 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

抽象类专题二:抽象类的用途

 
阅读更多

  抽象类通常代表一个抽象概念,它提供一个继承的出发点。而具体类则不同,具体类可以实例化,应当给出一个有商业逻辑实现的对象模版。由于抽象类不可以实例化,因此一个设计师设计一个新的抽象类,一定是用来继承的。

  而这一个声明倒过来也是对的:具体类不是用来继承的。

  具体类不是用来继承的

  只要有可能,不要从具体类继承。

  如下图所示,此类图就给出了一个继承形成的等级结构的典型例子。可以看出,所有的继承都是从抽象类开始的,而所有的具体类都没有子类。

  换言之,在一个以继承关系形成的等级结构里面,树叶节点均应当是具体类,而树枝节点均应当是抽象类(或者Java接口)。

  这样的设计是所有的Java设计师都应当努力做到的。

  代码重构的建议

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

  假设有两个具体类,类A和类B,类B是类A的子类,那么一个最简单的修改方案应当是建立一个抽象类(或者Java接口)C,然后让类A和类B成为抽象类C的子类,如下图所示。

  上面所给出的重构的例子实际上具有更加广泛的意义,这就是里氏替换原则。

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

  在一个从抽象类到多个具体类的继承关系中,共同的代码应当尽量移动到抽象类里。

  在一个继承的等级结构中,共同的代码应当尽量向等级结构的上方移动,如下图所示。把重复的代码从子类里面移动到超类里面,可以提高代码的复用率。由于代码在共同的超类而不是几个子类中出现,在代码发生改变时,设计师只需要修改一个地方。这对代码复用明显是有利的。

  一个对象从超类继承而来的代码,在不使用时不会造成对资源的浪费。回到前面所讨论的代码重构的例子,设计师将类A和类B的共享代码尽量移动到抽象超类C里面,是说尽可能将公共的方法移动到抽象策略角色中,如下图所示:

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

  与代码的移动方向相反的是,数据的移动方向是从抽象类到具体类,也即从继承的等级结构的高端想等级结构的低端移动,如下图所示。一个对象的数据不论是否使用都会占用资源,因此数据应当尽量放到具体类或者等级结构的低端。

  

  回到前面所讨论的重构的例子,设计师应当将类A和类B的数据保持在各自的类中,而不是移动到抽象超类C里面,这样可以保证节省内存资源。
分享到:
评论

相关推荐

    1.1:抽象方法与抽象类.pdf

    抽象类与抽象方法由abstract修饰 abstract的使用注意 抽象方法没有方法体 抽象成员只能存在于抽象类中 抽象类可以有非抽象成员(侧重族群的概念) 抽象类的子类必须实现抽象方法体 抽象类you构造函数 抽象类只能...

    表面积和体积_抽象类Shape_shape类继承_

    编写程序计算长方体、圆柱体和球的表面积和体积。要求先定义一个抽象类Shape如下:使用Shape类派生出长方体类、圆柱体类、球类,在这些类里分别实现继承的纯虚函数。使用如下代码测试运行。

    详细解析Java中抽象类和接口的区别

    抽象类和接口的区别 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。abstract class和interface之间在对于抽象类定义的支持...

    C#抽象类与抽象方法

    “抽象类允许(但不要求)抽象类包含抽象成员”。但是一个抽象类里不写抽象方法就没有意义了,既然如此,还不如直接写个普通类? 在一个抽象类里可以不声明抽象方法,这在语法上是没问题的,但实际来说,这样是没有...

    抽象类和接口的区别

    在Java中,可以通过两种形式来体现OOP(Object Oriented Programming,OOP,面向对象程序设计)的抽象:接口和抽象类。 这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换...

    java抽象类与接口实例java抽象类与接口实例

    java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...

    Java中抽象类和接口的区别

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    C#类、接口、虚方法和抽象方法-抽象类和接口的相同点和区别

    (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,...

    c++抽象类继承

    一个student类,lectureTeatre类,继承抽象module类,通过继承来实现接口

    实现抽象类求面积方法

    窗体应用程序。一个抽象类几何形状包含抽象求面积方法,三个继承类圆、矩形、三角形实现抽象类求面积方法。

    抽象类和接口实验报告.doc

    抽象类和接口实验报告

    Java源代码:抽象类和接口

    Java源代码:抽象类和接口 Java源代码:抽象类和接口

    dot Net中抽象类与接口的区别

    抽象类是一个不完全的类,着重族的概念。 • 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。 • 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义...

    Java抽象类与接口实验报告

    Java抽象类与接口实验报告

    java 抽象类与接口的练习

    java 抽象类与接口的练习,包括代码及注释,个人笔记

    Java:使用抽象类定义一个“形状类”,能够计算周长和面积。

    使用抽象类定义一个“形状类”,能够计算周长和面积,分别用矩形、三角形、圆形对形状类进行继承,并定义测试类进行测试输出周长和面积。

    Java继承_抽象类与接口的应用.

    1.继承及继承实例 2.方法重写(Overwrite) 3.super关键字 4.方法重载(Overload) 5.final修饰符 6.abstract修饰符 7.抽象类 8.接口 9.接口和抽象类对比 10.接口和抽象类使用场合实例 11.总结

    Java实例化一个抽象类对象的方法教程

    大家都知道抽象类无法实例化,就无法创建对象。所以下面这篇文章主要给大家介绍了关于Java实例化一个抽象类对象的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧...

    抽象类、接口、内部类、异常

    抽象类、接口、内部类、异常1.抽象类:被abstract修饰的类称为抽象类

    编写一个抽象类Shape

    1) 编写一个抽象类Shape,其中有抽象方法getArea()和getPerimeter() 2) 在Shape类的基础上派生出Rectangle和Circle类,二者都实现了计算面积的方法getArea()和计算周长的方法getPerimeter(); 3) 构造main...

Global site tag (gtag.js) - Google Analytics