震惊!现操作业1还可以这样完成!99%的人都不知道
来源:互联网 发布:关于网络的论文题目 编辑:程序博客网 时间:2024/05/01 12:24
只是记录一下学习过程。顺便写给一些需要的人看:)(虽然写的很烂&基本是贴代码)
忽略各种英文表达,以及Animal写成了Anmial等。由于懒得排版,代码就直接截图了。
由于我也是第一次接触C#,基于应用主义中间还跳过了一些地方(比如各种关键字),错误在所难免…有疑问/错误的请指出~
本文基于这样的前提:能完全看懂/看懂大部分helloworld的内容。
一、首先按照自己的想法先写出一个(面向过程的)相同功能的HW1。而不是在demo的基础上修改。
新建一个HW1的项目。诺,初始文件如下。
(嗯,之前已经看过helloworld了,应该大概知道这些文件都是什么)
看一下作业要求的界面。“在空白版上创建四个控件,两个Button(发言按钮、确定按钮),一个TextBox,一个TextBlock”,(TextBox: 输入框;TextBlock:文本显示控件)。如下图:
于是先从界面开始。打开MainPage.xaml。
Page标签下面有一堆命名空间,我不管他……参照helloworld的MainPage的内容,我们先看Button按钮。helloworld中的Button如下:
<Button x:Name="button" Content="Button"HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click" Margin="200,325,0,0"/>
从名字上看应该能理解各个属性的意义。
x:Name指定了Button的名称,这个名称是之后在MainPage类中获取这个Button的关键(在MainPage中通过this.button获取)。HorizontalAlignment ="Left" VerticalAlignment="Top"指定这个按钮在左上角,之后Margin是边距(间隔),四个数值按照约定我猜是left,top,right,bottom,也就是指定与左边间隔200,上边间隔325。Click指定了这个按钮被点击时调用MainPage类的Button_Click函数(咦为什么知道就是MainPage类呢 我猜是第二行的x:Class=”HW1.MainPage”指定的吧)。于是我们依葫芦画瓢,加上了两个Button以及TextBox, TextBlock。
运行,如下图:
欸看起来似乎差不多也耶。那么就完成下一个功能,点击Speak时随机一只动物说话。
给Speak的Button添加Click=”SpeakClick”。
并在MainPage.xaml.cs中的MainPage类中添加SpeakClick函数,其参数类型是(object sender, RoutedEvenetArgs args)。这些参数是看名字应该是事件发出者与事件参数,我也不理他了……如下:(忽略百度”C# 随机数” 以及“C# capitalize first char”(首字母大写) 的过程)
先是在动物名字的数组中随机选择一个名字,然后把名字的首字母大写,把相应的动物说的话添加到TextBlock中。运行一下~ 效果不错~
那么再加上Ok键点击的事件处理函数~
其中通过this.AnimalTextBox.Text获取输入框输入的内容。
这样就完成了HW1了。只不过,这很不面向对象。
二、于是开始重构。
首先很明显要抽象出来的就是Animal了。每种动物有自己的名字,或者是自己的说话方式。那么按照我的习惯的Java思维,新建了一个Animal抽象类,Cat, Dog, Pig继承自Animal类并分别实现say方法。(以下看的不是很懂就跳过)这里有个问题,demo中把动物作为接口interface,而接口适合的是-able,描述一个类能做什么,表示对象的能力。而类适合的是is, 例如Cat、Dog是(is)动物。举个例子,动物和机器人都能移动,我们可以用一个接口Moveable来表示这种移动的能力,动物和机器分别有不同的移动方式,动物之间也有不同的移动方式,分别实现对应的Move方法。如果在这里真的要用接口的话,应该用”会说话的”(不知道英文怎么说,姑且用Sayable吧)作为名称,用Animal作为名称很不恰当,或说话的不一定是动物。
再修改SpeakClick函数:
于是问题来了,要随机产生一个动物我们需要知道所有动物的列表。如此一来,每次增加动物种类就要修改这个动物的数组,这不符合开闭原则(可拓展而无需修改)。
同时,我们修改OkClick函数:
这里也有同样的问题,每次增加动物都需要增加switch的case。而且,另一方面,GetAnimalByName、GenerateRandomAnimal并不属于MainPage的职能范围(单一权责原则,一个类应只做好一件事),应该有一个专门的类来负责这些事情,所谓“AnimalFactory”。同时,要使得Anmial列表在每次增加子类时不需要修改,按照我的Java思维尿性,这里又要各种奇怪的设计模式了。但先把问题简化处理吧。
、这里把之前的GenerateRandomAnimal和GetAnimalByName抽出来作为AnimalFactory的方法。Dictionary(字典)是类似C++得到Map的数据结构,把动物的名字对应于相应的动物。
这样一来要增加动物只需要修改AnimalFactory,相对于原来增加一种动物要修改好几处好了一点点,虽然也没有完全解决问题(进一步可以用反射、枚举、注册工厂等奇奇怪怪的东西)。
但到这里就先停下,这代码很不C#,作业还要求用委托、事件、接口。
三、面向巨硬编程
我们强行面向事件,把这一流程改为:Speak被点击,触发Click事件,调用SpeakClick函数处理(到这为止和前面相同),SpeakClick中触发一个AnimalSaying事件(事件参数包含了动物要说的话),处理AnimalSaying事件时把说的话添加到TextBlock。
好像还没有用到接口。强行要用的话如下:
- 震惊!现操作业1还可以这样完成!99%的人都不知道
- 全中国99%的人都不知道,π居然可以这样求
- 震惊!竟然可以这样使用自己的SDK开发Android
- 震惊!史上最全的tarjan模板!99%的人都不知道!
- 震惊99%的OIer的不知道
- 数据还可以是这样的...
- 原来还可以这样,原来还可以这样。原来还可以这样,原来还可以这样,原来还可以这样
- 嗯,我就知道还可以的
- day4:不知道完成情况的作业
- 还不能成功,暂还不知道为什么会这样错的。
- 震惊!数字资产量化交易还可以有这种操作(1)
- ASP还可以这样写!
- malloc还可以这样用
- php还可以这样优化??
- Json还可以这样用
- Update还可以这样用
- Replication还可以这样玩
- Json还可以这样用
- 2017百度前端技术学院-自定义checkbox/radio
- java面试中的题解
- LeetCode算法题目:Add-Two-Number解决
- 离开了公司,你还有什么
- 第二章 从一个最简短的C++程序讲起
- 震惊!现操作业1还可以这样完成!99%的人都不知道
- @Autowired注解【Spring入门】
- Ubuntu安装eclipse,并创建桌面快捷方式
- 文章标题
- 三年无bug,提升代码质量的秘诀
- 未来之路(2):5条职业发展路线
- 2016-2017半年总结博客
- SailorPony_PCB_Iteration
- Spring定时(任务)刷新-quartz