利用继承高效率写程序

C++ 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为,新建的类称为。继承代表了关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等。代码如下:// 基类// eat() 函数// sleep() 函数//派生类。 阅读详情

2005年2月3日3:41:41

问题:
如果有两个JPopupMenu:a,b
a有个JMenu, b也有,但是b比a要多一个JMenuItem

我们用大写字母代表按钮上的名字
                  

                               __D
按钮a:   A__C__|__E
                              |__F

 

                           __D
                   C__|__E
                    |      |__F
按钮b    B--|  
                    |--G

         
我最初这样写的:

JPopupMenu a = new JPopupMenu("A");
JPopupMenu b = new JPopupMenu("B");
JMenu c = new JPopupMenu();        //想让a和b公有c     *_*
JMenuItem d = new JMenuItem("D");
JMenuItem e = new JMenuItem("E");
JMenuItem f = new JMenuItem("F");
c.add(d);
c.add(e);
c.add(f);
a.add(c);
现在的实际情况:a按钮是这样的
                __D
A__C__|__E
               |__F
好的,继续。
b.add(c);    //这条语句是后面失败的原因
JMenuItem g = new JMenuItem("G");
b.add(g);
到现在我想象的情况是:
                __D
A__C__|__E
               |__F

              __D
      C__|__E
       |      |__F
 B--|   
      |--G

但是一个组件是不能同时在两个Compoment里面的,所以
在b.add(c);这一句后,本来在a里面的c跑到b上面去了。
所以现在的实际情况是:

-


              __D
      C__|__E
      |      |__F
 B--|  
      |--G
正如我们所见,按钮a什么都没了:(

那么怎么办呢??
在我脑海里首先得到的解决方法是安步就班的一个一个写,
a和b重复的部分就要写两遍。
举个例子,这样写:(当然我没有这样写,为重复的每个按钮变量生成啊,取名啊,设置字体啊,设置颜色啊。。。太累了)

JPopupMenu a = new JPopupMenu("A");
JPopupMenu b = new JPopupMenu("B");
JMenu c = new JPopupMenu();
JMenuItem d = new JMenuItem("D");
JMenuItem e = new JMenuItem("E");
JMenuItem f = new JMenuItem("F");
c.add(d);
c.add(e);
c.add(f);
a.add(c);//a结束
JMenu g = new JPopupMenu();
JMenuItem h = new JMenuItem("D");
JMenuItem i = new JMenuItem("E");
JMenuItem j = new JMenuItem("F");
g.add(h);
g.add(i);
g.add(j);
JMenuItem k = new JMenuItem("G");
b.add(g);
b.add(k);//b结束
好了,现在的实际结果一定是正确的。
看上去假设这么写的好象没多少代码量,但是如前面所说,我们这只是做演示,加上字体、颜色、监听器等等实际上的代码量是非常大的!
其实最大的问题还不是代码量的问题,问题是你的程序的可读性大大降低了!!
要知道swing程序员不仅要构建复杂而且友好的界面,还要对大量的各种事件写监听器,在一大堆难读的代码中寻找按钮还不如要人家去电影院看100遍《2046》:)(2046实在难看,我直说好了)
我们需要让我们的程序可读性高,我不记得是哪位高手说的了:在一份程序的生命周期里,10%的时间用来写它,90%的时间是拿来给人家看的。
诸多原因,我们务必用优雅的方式解决问题:)

我最开始是这样想的:
能否自己写一个MyPopupMenu extends JPopupMenu
如果MyPopupMenu p = new MyPopupMenu();
有一部分MenuItem是已经存在在p里了?

经过实践,实践是真理:)
很快就搞定了。方法是这样的:
制作我们自己的MyJPopupMenu类,它继承自JPopupMenu,把公有的部分全部写进去,这样无论要怎么增加JMenuItem都不会烦了.
MyJPopupButton类如下:
假设在主类ManagerUI.java里面
public class ManagerUI
{
    private ...
    private Font font = new Font(...);
    private Color buttonColor = new Color(...);
    ...
    public ManagerUI()
    {
    ......
    }
    //这里是JPopupMenu的监听器
    private class MyPopupMenuListener implements ActionListener
    {
        ......
    }
    private class MyJPopupMenu extends JPopupMenu
    {
        private JMenuItem d = new JMenuItem("D");
        private JMenuItem e = new JMenuItem("E");
        private JMenuItem f = new JMenuItem("F");
        public MyJPopupMenu()
        {
        }
        public MyJPopupMenu(String name)
        {
            super(name);
        }
        //全部在这个方法里面一次性搞顶了,每个组件等会只需调用一下这个
        //public方法就ok了
        public void addPublicMenuItem()
        {
            //设置字体
            d.setFont(font);
            //设置颜色            
            d.setBackgroundColor(buttonColor); 
            e.setFont(font);
            e.setBackgroundColor(buttonColor);
            f.setFont(font);
            f.setBackgroundColor(buttonColor); 
            MyPopopMenuListener mp = new MyPopopMenuListener();
            d.addActionListener(mp); 
            e.addActionListener(mp);
            f.addActionListener(mp);        
            c.add(d);
            c.add(e);
            c.add(f);
            add(c);     //注意add()方法是继承超类JPopupMenu的
        }
    }
}

在原来需要产生JPopupMenu的地方加上我们的对象,代码是这样的:
public class ManagerUI
{
    private ...
    private Font font = new Font(...);
    private Color buttonColor = new Color(...);
    private JPopupMenu a;//注意这里我们是用公共类,MyJPopupMenu的
    private JPopupMenu b;//父类做的声明,等会需要向下转型
    ...
    public ManagerUI()
    {
        ......
   
        a = new MyJPopupMenu("A");               //非常简洁
        (MyJPopupMenu)a.addPublicMenuItem();     //记得向下转型
        b = new MyJPopupMenu("B");            
        (MyJPopupMenu)b.addPublicMenuItem();  
        JMenuItem c = new JMenuItem("G");      
        b.add(c);  
       
        .....                      
   
    }
    //这里是JPopupMenu的监听器
    private class MyPopupMenuListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            String id = ((JMenuItem)event.getSource()).getActionCommand();
            if(id.equals("D"))
            {...}
            else if(id.equals("E"))
            {...}
            else if(id.equals("F"))
            {...}
            else if(id.equals("G"))
            {...}
        }
    }
    private class MyJPopupMenu
    extends JPopupMenu
    implement ActionListener
    {
        private JMenuItem d = new JMenuItem("D");
        private JMenuItem e = new JMenuItem("E");
        private JMenuItem f = new JMenuItem("F");
        public MyJPopupMenu()
        {
        }
        public MyJPopupMenu(String name)
        {
            super(name);
        }
        public void addPublicMenu()
        {
            d.setFont(font);
            d.setBackgroundColor(buttonColor);
            e.setFont(font);
            e.setBackgroundColor(buttonColor);
            f.setFont(font);
            f.setBackgroundColor(buttonColor); 
            MyPopopMenuListener mp = new MyPopopMenuListener();
            d.addActionListener(mp); 
            e.addActionListener(mp);
            f.addActionListener(mp);        
            c.add(d);
            c.add(e);
            c.add(f);
            add(c);
        }
    }
}

最后运行的情况不用我说了,绝对正确无误:)
完了吗?
记得James Cooper说过反正他认为类越多就越难管理,我们可以进一步进行优化,
把JPopupMenu按钮的监听器类删掉吧,为什么不呢?
很简单,只需要用MyJPopupMenu类实现ActionListener接口就可以了
这样完整代码变成这样:

public class ManagerUI
{
    private ...
    private Font font = new Font(...);
    private Color buttonColor = new Color(...);
    private JPopupMenu a;
    private JPopupMenu b;
    ...
    public ManagerUI()
    {
        ......
   
        a = new MyJPopupMenu("A");              
        (MyJPopupMenu)a.addPublicMenuItem();    
        b = new MyJPopupMenu("B");            
        (MyJPopupMenu)b.addPublicMenuItem();  
        JMenuItem c = new JMenuItem("G");      
        b.add(c);  
       
        .....                      
   
    }
    private class MyJPopupMenu
    extends JPopupMenu
    implement ActionListener
    {
        private JMenuItem d = new JMenuItem("D");
        private JMenuItem e = new JMenuItem("E");
        private JMenuItem f = new JMenuItem("F");
        public MyJPopupMenu()
        {
        }
        public MyJPopupMenu(String name)
        {
            super(name);
        }
        public void addPublicMenu()
        {
            d.setFont(font);
            d.setBackgroundColor(buttonColor);
            e.setFont(font);
            e.setBackgroundColor(buttonColor);
            f.setFont(font);
            f.setBackgroundColor(buttonColor); 
            MyPopopMenuListener mp = new MyPopopMenuListener();
            d.addActionListener(this); //注意:记得把这里改成this
            e.addActionListener(this);
            f.addActionListener(this);        
            c.add(d);
            c.add(e);
            c.add(f);
            add(c);
        }
        //把actionPerformed()方法写到这里
        public void actionPerformed(ActionEvent event)
        {
            String id = ((JMenuItem)event.getSource()).getActionCommand();
            if(id.equals("D"))
            {...}
            else if(id.equals("E"))
            {...}
            else if(id.equals("F"))
            {...}
            else if(id.equals("G"))
            {...}
        }
    }
}
终于搞定了,以上代码为了方便阅读用a,b,c...等字母表示的,实际情况当然不是这样:)
小结:
没有什么技术含量...:)
我是菜鸟,平时注意自我总结小经验对自己的Java水平一定有帮助的:)

 

14.Django中模板的继承及引用 阅读详情

相关推荐

Flink CDC 实战:5分钟搞定PostgreSQL数据实时同步(附避坑指南)

本文详细介绍了如何使用Flink CDC实现PostgreSQL数据的实时同步,包括环境配置、逻辑复制槽创建、Flink环境搭建及实战验证。通过5分钟快速指南,帮助开发者高效搭建实时数据管道,并提供了常见问题排查和生产环境优化建议。

red88的博客 819

利用继承高效率写程序转

软件编程牛人网 2005年2月3日3:41:41 问题:如果有两个JPopupMenu:a,ba有个JMenu, b也有,但是b比a要多一个JMenuItem 我们用大写字母代表按钮上的名字                                                  __D按钮a:   A__C__|__E                              ...

hclworld的专栏 112

Oracle 11g版本下载及安装超详细教程图解

新手Oracle安装教程

weixin_43738344的博客 10万+

pool python 传参数_python多处理.pool.map,向派生进程传递参数

这些评论越来越难以理解,所以我把我的重要评论粘贴在这里:在Linux-y系统上,新进程是由fork()创建的,因此在创建它们时获取整个父进程地址空间的副本。它是“写时拷贝”,所以它更像是“虚拟”拷贝而不是“真实”拷贝,但仍然。。。;—)首先,尝试在创建巨大的数据结构之前创建Pool。然后子进程将继承更小的地址空间。在然后回答一些问题:so in python 2.7, there is no wa...

weixin_39733146的博客 260

保姆级教程:STK 11.0 从下载到安装成功(附Matlab互联配置与常见问题解决)

本文提供STK 11.0的完整安装指南,包括下载、安装步骤、Matlab互联配置及常见问题解决方案。详细介绍了系统要求核查、分步安装流程、关键文件替换和许可证配置,确保用户能够顺利完成STK 11.0的部署并实现与Matlab的无缝对接。

weixin_30698297的博客 345

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试与算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1105

9、C++继承

本章带领大家学习C++继承,了解继承方式和继承需要注意的事项。

如是牛 1113

迈创cameralink采集卡安装操作说明

迈创cameralink采集卡安装操作说明MIL软件安装MIL软件下载获取MIL软件安装MIL软件安装常见问题 MIL软件安装 MIL软件下载获取 MIL软件安装 解压MIL安装包,点击MilSetup.exe开始安装,如下图所示; 备注:64位系统MIL软件可以同时安装32位和64位客户端,本文档默认安装64位客户端,64位系统安装32位MIL方法后续再展开讲(不建议这样用,很麻烦) 点击Launch Installation开始安装,64位系统,默认只安装64位MIL客户端 根据采集卡驱动,选择M

qq_23107577的博客 9351

c++:继承(超详解)

目录一:什么是继承二:继承的格式继承的总结:二:子类和父类(基类和派生类)1.子类和父类的相互赋值:2.同名的成员变量3.同名成员函数三:子类中默认的成员函数1.构造函数2.析构函数3.拷贝构造4.赋值运算符重载 四:单继承和多继承单继承: 多继承:菱形继承解决方法一:解决方法二:单继承和多继承的总结:定义:继承(inheritance)机制是面向对象程序设计中使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生的新类,称派生类(或子类),被继承的类称基类(或父类)

qq_62718027的博客 8万+

【DaVinci Configurator专题】-5-通过Data Mapping自动创建CAN信号关联的Port并添加到APP SWC

目录 1 导入CAN Matrix变更后的Arxml文件 2 自动创建CAN信号关联的APP Port 3 CAN信号与App SWC的接口映射/连接 4 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: DaVinci Developer DaVinci Configurator Pro ARXML AUTOSAR System Description Network Explorer 1

「汽车电子助手」的博客 5129

基于TENG的呼吸测量与识别系统:从蓝牙到WiFi的改造与上位机实现

本文介绍了一种基于摩擦纳米发电机(TENG)的呼吸测量系统改造方案,将原有蓝牙通信升级为WiFi传输。系统通过TENG传感器采集呼吸信号,STM32微控制器处理数据后,经ESP8266 WiFi模块发送至上位机。文中详细阐述了硬件改造(四通道改单通道、蓝牙换WiFi)、嵌入式软件修改(包括ESP8266驱动、数据采集与TCP通信实现)以及上位机软件设计。改造后的系统提升了传输距离和稳定性,为可穿戴健康监测提供了更优解决方案。

huanghm88的专栏 110

C++ 继承详解

本文系统介绍了C++中的继承机制。首先阐述了继承的基本概念,包括基类与派生类的关系、三种继承方式(public/protected/private)及其访问控制规则。重点分析了派生类默认成员函数的实现规则,以及基类与派生类之间的转换关系。文章还探讨了特殊继承场景:单继承、多继承、菱形继承及虚继承的解决方案,比较了继承与组合两种代码复用方式的优缺点(is-a与has-a关系)。最后介绍了实现不可继承类的方法和继承体系中的静态成员特性。全文强调实际开发中应优先使用组合而非继承,以降低代码耦合度。

Felix_kiss_L的博客 1081

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 304

如何搭建高质量、高效率的前端工程体系--页面结构继承

推荐理由: 推荐理由: 程序员在我们的印象中,就是不停的敲代码;而写的程序如何确保不出现bug,而且还能及时发现问题,下面我推荐的这篇文章,围绕整个前端的开发流程出发解决这两个问题,帮助大家提高产品质量以及开发效率。希望对大家有用。 以下为文章原文 作者:莫卓颖 序言 相信很多程...

chonggengju6508的博客 222

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

类的继承和多态

如果汽车制造厂想生产一款新型汽车,一般是不会全部从头开始设计的,而是选择已有的某一型号汽车为基础,再增加一些新的功能,就研制成了新型号的汽车。这是提高生产效率的常用方法。 如果 ...

liweihua0007的博客 618

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C/C++填坑笔记——继承、重载和多态

目录 继承 语法: 访问控制和继承 多继承 重载 函数重载 运算符重载 多态 虚函数 继承 继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成...

沉迷单车的追风少年 1114

类与继承的总结

[size=medium][size=large][size=medium]1.为什么需要使用继承?[/size][/size][/size] java是面向对象的编程语言,是类构成了java语言,而继承又是java必不可少的,继承就是当你写一个类时,虽然这个类满足了某些功能但是你又想拓展它的功能,此时你就可以使用继承机制在写一个该类的子类,来完成你需要的功能,一旦子类继承了父类就拥有了...

shuhuanai11的专栏 174

关于继承的总结和体会

继承 什么是继承?面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。继承代表了 isa 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,...

Whalesss的博客 643

C# 继承

继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的,这个新的类被称为。继承的思想实现了关系。例如,哺乳动物动物,狗哺乳动物,因此狗动物。

unber的博客 319

在JavaScript实现基于原型的继承

5年前我写了在JavaScript中实现基于类模式的继承。它显示了JavaScript是基于像类一样,原型的语言(class-free, prototypal)。并且它有足够的能力去模仿一个“类”似的结构,我的程序样式在那之后进行了发展,就像是任何好的程序员应当的那样。我已经完全拥护“...

chenping0895的博客 188

Java知识点 封装继承覆写

This:每个对象中保存自身内存地址的一个引用变量 This就表示当前对象 在成员方法中或构造方法中区分同名的成员变量和局部变量 用在构造方法中,重载调用当前类中其他构造方法,必须写在构造方法第一行 this(。。); Return this返回当前对象的内存地址,可以链式调用 This不能出现在静态方法中 Static 在类体中 使用staic 修饰的变量 是静态变量 用static修饰的方法是静态方法 还可以用static定义静态语句块 静态语句块 static{ } 等同于...

m0_60600640的博客 277

继承(c++)

面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为,新建的类称为。继承是继承不了类的私有数据的。:公有继续,私有继承,受保护继承如果省略继承方式就是默认为。和访问修饰符一样,不写就是默认私有。最好不要继承太多父类,占用内存,而且任意函数重复。

2502_90360884的博客 917
上一篇: 如何衔接不同文件中的swing组件
下一篇: Shuffle集合或者数组中的元素
W1nt3rs
W1nt3rs 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄22年 977粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值