一个投资跟踪程序

我们考虑一个稍微简单一点的例子,在这个例子中,用一个类构造一个用户界面。假设我
们要编写一个程序来跟踪投资的效益。我们有股票、债券和基金等投资项目,对每一种投资项
目都要显示持有量的列表,这样就能够选择一种或多种投资项目并在图上标注出它们之间的效
益对比。

尽管不能事先预测在给定的时间内每种投资项目的拥有量,但我们还是希望,无论是对大数量
的投资项目(例如股票),还是小数量的投资项目〔例如基金),都有一种易于使用的显示方式。每
种情况下我们都想要一种多选显示,这样就能够选择一个或多个项目来标注。如果投资项目的数量
大,可以使用一个多选的列表框显示;如果只有三个或更少的项目,则使用几个复选框来表示。让
Builder类根据需要显示的项目个数生成界面,同时还要有相同的方法来返回结果。

下图是包含了少量债
券的显示。接下来我们考虑如何构造界面,来完成这种不同的显示。先创建一个multiChoice接口,
它定义了需要实现的方法。

public interface MultiChoice
{ArrayList getSelected();void clear();Panel getWindow();
}

C#在设计生成器类方面具有相当大的灵活性,我们可以直接访问这样一些方法,这些方法允
许我们由基本组件构建一个窗口。对本例来说,让每个生成器构建一个包含所需组件的面板,然后
将面板添加到窗体中,并确定它的位置。当改变显示时,删除旧的面板,添加上新的面板。在C#
里,面板只是一个无边框的、能包含多个windows组件的容器。这里面板的两种实现过程都必须
满足multiChoice接口。

接下来创建一个抽象基类Equities,并由它派生出Stocks,Bonds和Mutuals类。

public abstruct class Equities
{protected ArrayList array;public abstract string ToString();public ArrayList getNames(){return array;}public int Count(){return array.Count;}
}

注意抽象方法Tostring,我们用该方法在列表框中显示每种股票。Stocks类只包含了向ArrayList
中添加股票名称的代码。

public class Stocks.Equities
{public Stocks(){array=new ArrayList();array.Add("Cisco");array.Add("Coca Cola");array.Add("GE");array.Add("Harley Davidson");array.Add("IBM");array.Add("Microsoft");}public override string ToString(){return "Stocks";}
}

其余的全部代码(getNames方法和count方法)已经在基类Equities实现。Bonds类和Mutuals
类与此完全类似。

StockFactory

我们需要一个简单的来决定,要返回的是一个复选框面板还是一个列表框面板。我们把这个
类称为StockFactory。由于我们只需要该类的一个实例,因而在创建该类时让其中的一个方法为静
态的。

public class StockFactory
{public static MultiChoice getBuilder(Equities stocks){if(stocks.count()<=3){return new CheckChoice(stocks);}else{return new ListChoice(stocks);}}
}

由于只需要该类的一个实例,所以我们把getBuilder方法声明为静态的,然后就可以直接调用
它而无需创建该类的实例。用设计模式的语言来讲,这个简单工厂类叫做Director,而由multiChoice
类派生出来的实际类就是Builder。

CheckChoice类

这里的复选框生磽器构建了一个包含0到3个复选框的面板,并将面板返回给调用程序。

public class checkChoice:MultiChoice
{private ArrayList stocks;private Panel panel;private ArrayList boxes;public checkChoice(Equities stks){stocks=stks.getNames();panel=new Panel();boxes=new ArrayList();for(int i=0;i<stocks.Count;i++){CheckBox ck=new CheckBox();ck.Location=new Point(8,16+i*32);string stk=(string)stocks[i];ck.Text=stk;ck.Size=new Size(112,24);ck.TabIndex=0;ck.TextAlign=ContentAlignment.MiddleLeft;boxes.Add(ck);panel.Controls.Add(ck);}}
}

返回窗口和选中名称列表的方法吓所示。注意,这里把由ArrayList返回的对象类型转换为
该方法实际需要的CheckBox类型。

public void clear()
{for(int i=0;i<boxes.Count;i++){CheckBox ck=(CheckBox)boxes[i];ck.Checked=false;}
}public ArrayList getSelected()
{ArrayList sels=new ArrayList();for(int i=0;i<boxes.Count;i++){CheckBox ck=(CheckBox)boxes[i];for(int i=0;i<boxes.Count;i++){CheckBox ck=(CheckBox)boxes[i];if(ck.Checked){sels.Add(ck.Text);}}return sels;}public Panel getWindow(){return panel;}
}

ListboxChoice类

该类创建一个多选列表框,并将其插人到一个面板中,然后将名称加到列表里。

public class ListChoice:MultiChoice
{private ArrayList stocks;private Panel panel;private ListBox list;public ListChoice(Equities stks){stocks=stks.getNames();panel=new Panel();list=new ListBox();list.Location=new Point(16,0);list.Size=new Size(120,160);list.SelectionMode=SelectionMode.MultiExtented;list.TabIndex=0;panel.Controls.Add(list);for(int i=0;i<stocks.Count;i++)list.Items.Add(stocks[i]);}
}

由于这是一个多选列表框,我们可以把所有选中的项目都存放在一个selectedlndlces集合中。
该方法只对多选列表框起作用,对于单选列表框它只返回一个1。这里用这种方法将选中的名称加
到ArrayList中,程序如下所示。

public Panel getWindow()
{return panel_;
}public ArrayList getSelected()
{ArrayList sels=new ArrayList();ListBox.SelectedObjectCollection coll=list.SelectedItems;for(int i=0;i<coll.Count;i++){string item=(string)coll[i];sels.Add(item);}return sels;
}public void clear()
{list.Items.Clear();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95228.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95228.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95228.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DBCExcelConvent】CAN报文解析辅助工具之DBC与Excel互转

前言 CAN总线翻译文件DBC是整车解析过程中非常核心的一部分&#xff0c;因此为了能被各大CAN工具解析&#xff0c;它也有自己的一套编码规则。但并不是无时无刻都有条件打开该文件&#xff0c;对于工程师而言。其实比较直观和通用的大多数还是Excel表格。因此&#xff0c;为了打…

如何将iPhone日历传输到电脑

iPhone日历是i设备上一个非常出色的内置应用程序&#xff0c;可以帮助你创建、查看和管理日程或事件。对于所有iPhone用户来说&#xff0c;在iPhone日历上添加新事件非常容易。然而&#xff0c;当涉及到将日历从iPhone传输到电脑时&#xff0c;许多人可能会感到困惑&#xff0c…

TDengine 3.3.7.0 新增性能基准工具 taosgen

taosgen 工具参考手册 taosgen 是时序数据领域产品的性能基准测试工具&#xff0c;支持数据生成、写入性能测试等功能。taosgen 以“作业”为基础单元&#xff0c;作业是由用户定义&#xff0c;用于完成特定任务的一组操作集合。每个作业包含一个或多个步骤&#xff0c;并可通…

模式组合应用-组合模式

写在前面Hello&#xff0c;我是易元&#xff0c;这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误&#xff0c;欢迎大家留言指正&#xff01; 本文为设计模式间的组合使用&#xff0c;涉及代码较多&#xff0c;个人觉得熟能生巧&#xff0c;希望自己能从中学习到新…

在Ubuntu中安装配置MySql Server

1.安装MySql Server在命令行控制台执行安装命令&#xff1a;sudo apt install mysql-server安装完成后&#xff0c;因为没有root用户的密码&#xff0c;所以&#xff0c;登录不了mysql的cli。另外&#xff0c;MySql 8以上&#xff0c;lower-case-table-names默认值0&#xff0c…

Docker 40个自动化管理脚本-1 (20/40)

文章目录1. 自动化容器创建脚本2. 批量启动所有容器3. 批量停止运行中容器#!/bin/bash4. 批量删除停止的容器5. 运行容器并在退出后自动清理6. 自动重启关键容器7. 容器资源监控脚本8. 监控所有容器资源使用9. 检查所有容器日志10. 清理未使用资源脚本11. 删除悬空镜像12. 容器…

Go学习1:常量、变量的命名

golang 安装 | go-zero Documentation 在这个文档里&#xff0c;环境变量系统自动配好了&#xff08;自定义的一样&#xff09;不需要修改环境变量。 我下载的是1.25版本的。 目前使用go mod管理项目。 C的产出比太低&#xff0c;而Java和C#哲学又来源于C。 Go语言成功的项目…

2025_WSL2_Ubuntu20.04_C++20_concept 环境配置

需要使用 c20 新特性 concept 泛型约束 记录如何在 wsl2 里面配置环境&#xff0c;如果需要源工程&#xff0c;可以私发 背景&#xff1a;使用 CMakeLists.txt 配置整个工程 从官网 https://gcc.gnu.org/projects/cxx-status.html#cxx20 可以看到 concept 受 g10 支持这里注意虽…

Encoder编码器

Encoder编码器 #include <libavutil/log.h> #include <libavutil/opt.h> #include <libavcodec/avcodec.h>static int encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *out){int ret -1;ret avcodec_send_frame(ctx, frame);if(ret <…

微服务-ruoyi-cloud部署

微服务 阿里 阿里nacos 注册中心&#xff0c;配置中心 spring cloud gateway网关 公共服务 阿里sentinel 面向分布式、多语言异构化服务架构的流量治理组件 阿里seata 是一款开源的分布式事务解决方案 nginx 静态资源服器 反向代理 ruoyi-cloud部署架构 VM配置 网…

Win7能看到Win10打印机但连接不上

解决方案&#xff1a;方法1.修改注册表&#xff08;适用于错误代码0x0000011b&#xff09;修改注册表&#xff08;关键步骤&#xff09;&#xff1a;许多情况下&#xff0c;这是由于Win10的一项隐私设置导致的1。在Win10电脑上&#xff0c;按 Win R&#xff0c;输入 regedit 并…

如何构建灵活、可控、可扩展的多云网络底座

在 AI 和数字化的浪潮中&#xff0c;越来越多的企业不再满足于单一云环境&#xff0c;而是同时使用 多家公有云、自建IDC、甚至边缘节点。这种多云模式虽然灵活&#xff0c;但也带来了一个新的挑战&#xff1a;如何让跨云、跨地的数据流动变得高效、安全、可控&#xff1f;答案…

幂等性设计艺术:在分布式重试风暴中构筑坚不可摧的防线

幂等性设计艺术&#xff1a;在分布式重试风暴中构筑坚不可摧的防线​​2023年某支付平台凌晨故障​​&#xff1a;由于网络抖动导致支付指令重复发送&#xff0c;系统在2分钟内处理了​​17万笔重复交易​​&#xff0c;引发​​4.2亿资金风险​​。事故根本原因&#xff1a;​…

从零开始理解NDT算法的原理及应用

1. 概述 NDT&#xff0c;全称 Normal Distributions Transform&#xff08;正态分布变换&#xff09;&#xff0c;是一种广泛使用的点云配准算法&#xff0c;它的核心思想与ICP截然不同&#xff1a;NDT不直接计算点与点之间的对应关系&#xff0c;而是通过概率模型来描述和匹配…

艾体宝案例 | 数据驱动破局:DOMO 如何重塑宠物零售门店的生存法则

某连锁宠物店店长紧盯着电脑屏幕上的Excel表格&#xff0c;手指机械地在键盘上敲击出“CtrlC/V”的组合键——这是她第17次尝试将三个不同系统的数据拼凑到一起。门店POS机导出的销售记录、会员系统的消费偏好、库存管理的临期预警&#xff0c;这些本应串联起门店运营全貌的关键…

极飞科技AI智慧农业实践:3000亩棉田2人管理+产量提15%,精准灌溉与老农操作门槛引讨论

在新疆尉犁县的棉田里&#xff0c;两架农业无人机正沿着设定航线低空飞行&#xff0c;它们掠过之处&#xff0c;传感器实时传回土壤湿度和作物长势数据——这片3000亩的棉田&#xff0c;如今只需要两名90后新农人通过手机管理&#xff0c;产量却比传统种植模式提高了15%。这不是…

企业级-搭建CICD(持续集成持续交付)实验手册

搭建CI/CD(持续集成/持续交付)企业示例 为了让容器构建镜像并可以持续集成&#xff0c;可以自动上传到Harbor仓库&#xff1b;并且业务主机可以通过CD自动从仓库中下载镜像latest版本并实现业务更新。1.环境部署 1.1 环境搭建业务IP域名GitLab172.25.254.50gitlab.dhj.orgJenki…

吃透《数据结构》C 语言版:线性表的类型定义详解

作为数据结构的入门章节&#xff0c;线性表就像 “地基” 一样重要&#xff0c;而第二章 2.3 节的 “线性表的类型定义”&#xff0c;更是理解后续操作&#xff08;插入、删除、查找等&#xff09;的核心前提。今天就结合自己的学习笔记&#xff0c;用通俗的语言拆解这个知识点…

文件系统中的核心数据结构

宏观上文件系统在kernel的形态文件系统运作流程按照:vfs->磁盘缓存->实际磁盘文件系统->通用块设备层->io调度层->块设备驱动层->磁盘。具体流程的详细展现如下如如何理解文件系统中的数据结构&#xff1f;linux中文件系统还有几种核心数据结构分别是super_b…

TDengine与StarRocks在技术架构和适用场景上有哪些主要区别?

TDengine 与 StarRocks 作为国产数据库领域的代表性产品&#xff0c;分别专注于时序数据处理和高性能分析场景&#xff0c;在技术架构和适用场景上存在显著差异。以下从核心架构、数据模型、性能特点及典型应用场景等方面进行对比分析&#xff1a;&#x1f3d7;️ ​​一、技术…