- 介入或许尽管使用接口来编程
.NET框架包罗类和接口.当你写程序的时辰,你或许懂得你正在用.NET的哪个类.但是,在这类状况下介入你用.NET撑持的接口而不是它的类来编程时,你的代码会变得更加不乱、可用性会更高.请解析下面的代码:
private void LoadList (object [] items,
ListBox l)
{
for (int i = 0;i < items.Length;i++)
l.Items.Add (items[i].ToString ());
}
那个函数从一个可为任何对象的数组中加载ListBox.这段代码被限定为只能使用数组.假想过些时辰你发觉那些对象存在信息库中,或不的集合中.那么你需要修改程序来使用差不的集合类型.介入你用ICollection接口来写那段程序,你就不必修改那段程序啦,对于任何实现ICollection接口的类型它都能非常好的任务:private void LoadList (ICollection items,
ListBox l)
{
foreach (object o in items)
l.Items.Add (o.ToString ());
}
ICollection被数组和全部System.Collection中的集合实现.另外,多维数组也撑持ICollection接口.介入那还不够的话,信息库.NET类同样撑持ICollection接口.用接口写的那个函数不必须改就能才非常多中状况下使用.
2,使用属性代替原始信息
因为属性差不多成为语言自已的元素,所以表明信息元素时它的作用域品级没有需要大于private.因为代码自已会把属性看成信息元素,你同时没有落空使用简单信息类型的便当性 .相反它会使你的代码更加机动功能更减少盛.属性使你的信息元素封装性更好.属性可以让你使用lazy evaluation来返回信息.lazy evaluation的意思是当用户要求时才统计它的值,而不是一贯保留着它.
末啦,属性可所以 virtual也可所以 abstract.你也能够在接口中定义属性.
那个地点还有维护角度的身分该当看重:尽管操纵两者的方式是同样的,但是你把一个信息元素变成属性,那么原先客户端的程序便不能会晤服务端的新版本程序了.事实上对于在Web service中你想实现序列化的值你可以把它们变成属性来使用:private int TheMonth = 0;
[XmlAttribute (“Month”)]
public int Month
{
gain {
return TheMonth;
}
set {
TheMonth = value;
}
}
简单通过属性就能使你的全部信息元素私有化.
3,在ProducerConsumer的Idiom中使用Delegate
当你生成一个实现producer idiom类的时辰,使用deletate来关照consumer.这类方式相对于用接口更加机动.Delegate是多点传送的,所以不必加分外的代码你就何以撑持多用户.相对于用接口似许做可使类之间的耦合性下降.下面的类操纵键盘输入同时把它传给全部的registered listeners:public class KeyboardProcessor
{
private OnGetLine theFunc = null;
public OnGetLine OnGetLineCallback {
gain {
return theFunc;
}
set {
theFunc = value;
}
}
public void Run (){
Read input.
If there is any listeners,publish:
string s;
do {
s = Console.ReadLine ();
if (s.Length == 0)
break;
if (theFunc != null){
System.Delegate [] funcs =
theFunc.GetInvocationList();
foreach (OnGetLine f in funcs) {
try {
f (s);
} catch (Exception e) {
Console.WriteLine
(“Caught Exception:{0}”,
e.Message);
}
}
}
} while (true);
}
任何数妄图listeners都可注册到producer,它们所要做的只是供应一个特定的函数:deletate.