震惊!现操作业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。




好像还没有用到接口。强行要用的话如下:



0 0
原创粉丝点击