C#老鼠遇见猫,以及主人的编程题

jhdxhj 2010-07-15 08:50:15
具体是怎么样的,哪位能否说详细点
...全文
605 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
为任意用户控件增加新的共嫩 --> 为任意用户控件增加新的手指拖动的功能

我们只要写一句话:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.setUserAvatar1.SetDragEvents();
}
}

这就为控件 setUserAvatar1 (其实任何用户控件都可以)添加了这个功能。多么简单!

我们还可以更好地处理手指滑动行为,例如支持左右移动、为控件的移动增加速度感觉等等。而我要用这个程序强调的是,事件使用起来是多么轻松的东西啊,可不要太繁文缛节又是这么设计又是那么模式化地。
jsonzbc 2010-07-15
  • 打赏
  • 举报
回复
受教了...
  • 打赏
  • 举报
回复
嗯,让我们看看怎样让mobile手机界面像iPhone界面一样上下滑动。其实很简单,假设要让一个用户控件相对于它的父控件上下滑动(当它的界面大小大于父控件所留出的大小时),我们可以使用扩展方法来为任意用户控件增加新的共嫩:
using System.Drawing;
using System.Windows.Forms;

namespace MyNameSpace
{
public static class Extensions
{
public static void SetDragEvents(this UserControl ctrl)
{
bool DragFlag = false;
Point PreviousPoint = Point.Empty;
ctrl.MouseDown += (s, e) =>
{
DragFlag = true;
PreviousPoint = new Point(e.X, e.Y);
ctrl.SuspendLayout();
};
ctrl.MouseUp += (s, e) =>
DragFlag = false;
{
DragFlag = false;
ctrl.ResumeLayout();
};
ctrl.MouseMove += (s, e) =>
{
if (DragFlag)
{
var t = ctrl.Top + e.Y - PreviousPoint.Y;
if (t <= 0 && t + ctrl.Height >= ctrl.Parent.Height)
ctrl.Top = t;
}
};
}
}
}


好了,这就可以用手指拖动控件的留白处上下移动界面了。这样我们就可以设计一个比窗体高很多的用户控件,例如用户需要5、6个步骤才能操作完的、但是功能极其浓缩的界面。

我想强调的是,从代码中你就能看出,这里我们为任意ctrl增加了3个事件处理程序(也许它早就有别的程序已经对相同的事件注册过处理程序,但是我们的程序根本不管它),并且这些事件程序还能使用在时间处理程序之外定义的记忆状态的变量值,所有这一切我们都是在一个方法里搞定!

因此可以看到这种开发理念,我们需要ctrl搞什么很特殊模式吗?我们也没有去声明和创建什么单独的观察者对象实例,我们就是在这样一个方法中写几行简单的代码而已嘛!

学.net设计,不一定照抄10几年前的java早期的书本知识,你当作猎奇去看看设计模式就足够了!
gengchenhui 2010-07-15
  • 打赏
  • 举报
回复
我只知道那叫“观察着模式”。。。。。。。。。。。
RHCL 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dongxinxi 的回复:]
设计模式如果成为八股文就会让人错误地滥用起来,设计模式只有观摩意义而对于许多开发者其实是一种坏味道
[/Quote]
学习~
RHCL 2010-07-15
  • 打赏
  • 举报
回复
学习~~
小_虎 2010-07-15
  • 打赏
  • 举报
回复
有几天没跟sp1234了。。

来看看
zw_548498 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sp1234 的回复:]
人醒了可以有无限种可能性,但是都设计“人”类时的职责 --> 人醒了可以有无限种可能性,但是都不是设计“人”类时的职责
[/Quote]

多谢分享
  • 打赏
  • 举报
回复
楼上回答近乎完美了,学习了
  • 打赏
  • 举报
回复
或者修改一下需求描述:
using System;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
老鼠 m = new 老鼠();
人 p = new 人();
猫 c = new 猫();
c.叫了 += p.醒了;
m.跑了 += c.叫;
Console.WriteLine("测试开始............");
m.开跑();
Console.WriteLine("..................测试结束!");
Console.ReadKey();
}
}

public class 老鼠
{
public event Action 跑了;

public void 开跑()
{
Console.WriteLine("老鼠跑");
if (跑了 != null)
跑了();
}
}

public class 猫
{
public event Action 叫了;

public void 叫()
{
Console.WriteLine("猫叫");
if (this.叫了 != null)
this.叫了();
}
}

public class 人
{
public void 醒了()
{
Console.WriteLine("人醒了");
}
}
}
  • 打赏
  • 举报
回复
人醒了可以有无限种可能性,但是都设计“人”类时的职责 --> 人醒了可以有无限种可能性,但是都不是设计“人”类时的职责
  • 打赏
  • 举报
回复
哦补充一下:当你设计“人”和“猫”类时根本不依赖“老鼠”类型,在设计“人”和“猫”类的行为时,也不知道调用者要如何绑定行为。

你在设计“人”类是,怎么就知道只是

public Man(IRatSubject[] ratSub, ICatSubject catSub)


这个定义呢?你封装了“人”类进类库中,然后使用它的程序员把人跟“闹钟”关联起来,“闹钟一响人就醒了”。人醒了可以有无限种可能性,但是都设计“人”类时的职责。


设计模式如果成为八股文就会让人错误地滥用起来,设计模式只有观摩意义而对于许多开发者其实是一种坏味道。
剑锋冷月 2010-07-15
  • 打赏
  • 举报
回复
学习观察者模式和委托事件时,这个类子很有用。
tongji2008 2010-07-15
  • 打赏
  • 举报
回复
友情帮顶。。。 学习
挺有意思的题目,我也在学C#,不错~~
  • 打赏
  • 举报
回复
要注意:事件不需要纠缠(耦合)类型!当你设计“人”和“猫”类时,根本不依赖“老鼠”类型,这样才能体现依赖倒置的需求(在将来的工程中才设计使用事件的新类型)。

如果你在设计使用事件的类型是,还要纠缠触发事件的类型定义,那么就白学设计了(白学设计模式了),赶紧“幡然醒悟”吧!
  • 打赏
  • 举报
回复
不玩设计模式。

对于c#来说(也包括所有.net平台开发语言以及早期的vb版本都是基于事件驱动方式),就是:
using System;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
老鼠 m = new 老鼠();
人 p = new 人();
猫 c = new 猫();
m.跑了 += c.叫;
m.跑了 += p.醒了;
Console.WriteLine("测试开始............");
m.开跑();
Console.WriteLine("..................测试结束!");
Console.ReadKey();
}
}

public class 老鼠
{
public event Action 跑了;

public void 开跑()
{
Console.WriteLine("老鼠跑");
if (跑了 != null)
跑了();
}
}

public class 猫
{
public void 叫()
{
Console.WriteLine("猫叫");
}
}

public class 人
{
public void 醒了()
{
Console.WriteLine("人醒了");
}
}
}


这里最关键的就是让两个完全不同class的对象实例去监听老鼠跑的动作,如果写出这两句就可以100分了。
兔子-顾问 2010-07-15
  • 打赏
  • 举报
回复

using System;
using System.Collections;
namespace test
{
public interface ICatCatcher
{
void DoSth();
}

public interface ICatSubject
{
void RegesiterCatCatcher(ICatCatcher catCatcher);
void Miao();
}

public interface IRatSubject
{
void RegesiterRatCatcher(IRatCatcher ratCatcher);
void Run();
}

public interface IRatCatcher
{
void Wake();
}

public class Cat : ICatSubject
{
public Cat()
{
}

private ArrayList catcherList = new ArrayList();
public void RegesiterCatCatcher(ICatCatcher catcher)
{
catcherList.Add(catcher);
}

public void Miao()
{
Console.WriteLine("Miao");
for (int i = 0; i < catcherList.Count; i++)
{
ICatCatcher catCatcher = (ICatCatcher)catcherList[i];
catCatcher.DoSth();
}
}

[STAThread]
public static void Main()
{
Cat cat = new Cat();
Rat[] rat = new Rat[10];

for (int i = 0; i < 10; i++)
{
rat[i] = new Rat(cat);
}

Man man = new Man(rat, cat);
cat.Miao();
}
}

public class Rat : ICatCatcher, IRatSubject
{
public Rat(ICatSubject catSub)
{
catSub.RegesiterCatCatcher(this);
}

public void DoSth()
{
Run();
}

private ArrayList ratcherList = new ArrayList();
public void RegesiterRatCatcher(IRatCatcher catcher)
{
ratcherList.Add(catcher);

}

public void Run()
{
Console.WriteLine("Rat Run");
for (int i = 0; i < ratcherList.Count; i++)
{
IRatCatcher ratCatcher = (IRatCatcher)ratcherList[i];
ratCatcher.Wake();
}
}
}

public class Man : ICatCatcher, IRatCatcher
{
public Man(IRatSubject[] ratSub, ICatSubject catSub)
{
for (int i = 0; i < ratSub.Length; i++)
{
ratSub[i].RegesiterRatCatcher(this);
}
catSub.RegesiterCatCatcher(this);
}

public void DoSth()
{
Console.WriteLine("Cat bring on Wake");
}

public void Wake()
{
Console.WriteLine("Rats bring on Wake");
}
}
}


或者
http://hi.baidu.com/xiao_5_zi/blog/item/fe42f522db5073589922edff.html
loveheye 2010-07-15
  • 打赏
  • 举报
回复
楼主是去面试吧?~?

[Quote=引用 1 楼 amandag 的回复:]
C#可以用委托和事件解决
也可以用设计模式中的观察者模式解决
[/Quote]

就是这样咯~~ 具体代码 网上一搜一大把的
myhope88 2010-07-15
  • 打赏
  • 举报
回复
网上搜一下就有了,很多的
amandag 2010-07-15
  • 打赏
  • 举报
回复
C#可以用委托和事件解决
也可以用设计模式中的观察者模式解决
加载更多回复(7)

111,105

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧