在设计类时,慎用继承,或尽量少用继承

原创 2007年09月21日 09:53:00



 模式设计告诉我们在设计类时,尽量用以下原则:
1)、对接口编程,而不对实现编程
2)、对类的功能扩展,要多用组合,少用继承。
为什么要多用组合,少用继承呢?因为子类可能继承了对子类没用的或者有害的方法。请看下例:
要求:我们在输入以下键和值时,输出也保持值的顺序
  map.put("a","111");
  map.put("v","190");
  map.put("d","132");
1、采用继承的方式来设计类

import java.util.ArrayList;
import
 java.util.HashMap;
import
 java.util.List;

//采用继承的方式来设计类

public class ListMap extends HashMap  {

    
private static final long serialVersionUID = -6040757858724463221L
;
    
private
 List list;
    
public
 ListMap(){
        
super
();
        
this.list=new
 ArrayList();
    }
    
    
//重写父类中的方法put在此映射中关联指定值与指定键

    public Object put(Object key,Object value)
    {
        
if
(list.contains(key))
        {
            list.remove(key);
        }
        
this
.list.add(key);
        
return super
.put(key,value);
    }
    
    
public Object getKey(int
 i){
        
return this
.list.get(i);
    }
    
    
//获得对应键的值

    public Object getValue(int i){
        
return this
.get(getKey(i));
    }
    
    
public int
 size()
    {
        
return this
.list.size();
    }
    
    
public static void
 main(String[] args) {
        ListMap map
=new
 ListMap();
        map.put(
"a","111"
);
        map.put(
"v","190"
);
        map.put(
"d","132"
);
        
//利用自己建立的方法getValue()保证输出有序

        for(int i=0;i<map.size();i++){
            System.out.println(map.getValue(i));
        }
        
        System.out.println();
        
        
//利用从HashMap中继承的方法values()输出不保证有序

        String[] list=(String[])map.values().toArray(new String[0]);
        
for (int i = 0; i < list.length; i++
) {
            System.out.println(list[i]);
        }
    }
}

输出:
111
190
132

132
111
190
此时会发现,采用继承的方式来设计类,容易让使用者使用父类中没用的方法values(),从而不能保证结果正确
2、采用组合的方式来设计类

import java.util.ArrayList;
import
 java.util.HashMap;
import
 java.util.List;

//采用组合的方式来设计类

public class MyListMap{

    
//只利用HashMap中部分方法,定义一个HashMap的内部变量

    private HashMap map;
    
private
 List list;
    
public
 MyListMap(){
        
this.map=new
 HashMap();
        
this.list=new
 ArrayList();
    }
    
    
//自己写个方法put在此映射中关联指定值与指定键

    public Object put(Object key,Object value)
    {
        
if
(list.contains(key))
        {
            list.remove(key);
        }
        
this
.list.add(key);
        
//调用HashMap中put方法

        return this.map.put(key,value);
    }
    
    
public Object getKey(int
 i){
        
return this
.list.get(i);
    }
    
    
//获得对应键的值

    public Object getValue(int i){
        
//调用HashMap中get方法

        return this.map.get(getKey(i));
    }
    
    
public int
 size()
    {
        
return this
.list.size();
    }
    
    
public static void
 main(String[] args) {
        MyListMap map
=new
 MyListMap();
        map.put(
"a","111"
);
        map.put(
"v","190"
);
        map.put(
"d","132"
);
        
//利用自己建立的方法getValue()保证输出有序

        for(int i=0;i<map.size();i++){
            System.out.println(map.getValue(i));
        }
        
        System.out.println();
        
        
//
此时用values()就出错,因为此时不存在此方法
//
        String[] list=(String[])map.values().toArray(new String[0]);
//
        for (int i = 0; i < list.length; i++) {
//
            System.out.println(list[i]);
//        }

    }
}

输出:
111
190
132
此时使用者不能使用HashMap类中的方法values(),在次类中不存在此方法,从而避免用户误用。

所以:在设计类时,慎用继承,或尽量少用继承。

版权声明:本文为博主原创文章,未经博主允许不得转载。

我是一个尽量少用国产软件的软件开发工程师

[作者] 网名: 猪头三 站点: http://www.x86asm.com Email: 643439947@qq.com QQ: 643439947 编程生涯: 2001~至今[15...

String为什么尽量少用+ stringbuildd的原因

String为什么尽量少用+ stringbuildd的原因

为了避免乱码应尽量少用GB2312编码

文章是半转载,半原创的。如有表述不对的,还请各位看官淡定! 今天在折腾MySql数据库的时候,SQL-Front里所有的字符串编码,包括my.ini配置文件里的default-character-s...

设计模式(2)-策略模式之多用组合少用继承

设计模式(2)-策略模式之多用组合少用继承 首先看一下策略模式的意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 结构   ...

已知需要找给顾客的零钱金额为N,当前钱币的面值种类为1,9,10三种,求找给顾客尽量少的钱币数的找零方法,给出程序算法设计思路

这个需要用的算法叫贪心算法,也叫贪婪算法。算法有很多种,楼主目前没有研究过,所以只针对这个问题讲一下自己的理解。 贪心算法之所以叫贪心,因为它的特点是不针对大局,只针对局部,在当前条件下选择最优解,所...

设计模式之多用组合,少用继承

对类的功能的扩展,要多用组合,少用继承。  对于类的扩展,在面向对象的编程过程中,我们首先想到的是类的继承,由子类继承父类,从而完成了对子类功能的扩展。但是,面向对象的原则告诉我们,对类的功能的扩展...

第二篇: 在类的头文件中尽量少引入其他头文件

第一篇: 在类的头文件中尽量少引入其他头文件0、介绍与C和C++一样, Objective-C也使用 “头文件” 与 “实现文件” 来去个代码。Objective-C语言编写”类”的标注方式为: 以类...

面向对象为什么要多用对象模式而少用继承模式?

进来学习java的时候遇到了一些经验说多用对象模式,少用继承模式。现在写一点感想。 面向对象的对象之间的哦和方式有继承,实现,关联,依赖,聚合和组合。其中的继承和实现是继承这类模式。 说道的一个原...
  • ndcnb
  • ndcnb
  • 2014年06月14日 17:51
  • 1049

挂多个css还是新建class-多用组合,少用继承

转载于http://blog.csdn.net/hacke2/article/details/21707133 5. CSS的聚合/组合原则--挂多个class还是新建 CSS里也包含了设...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在设计类时,慎用继承,或尽量少用继承
举报原因:
原因补充:

(最多只允许输入30个字)