首页 >> 民生历史

泛型集合类型赋予集合业务意义增强集合的抽节能

民生历史  2020-10-03 10:14 字号: 大 中 小

1、很多程序员不喜欢看到泛型的身影,他们看到“”这样的符号就会头痛并难受。受雇于人的我就只能竭尽我所能发起一场消除“”的行动,事实上这一点又变得有一些extend意义。

2、extend意义:赋予集合类更强的业务意义,搭配其自身所拥有的更多的自我描述解释操作的Action,类的行为将更加地具体,这样的类是OO中比较受欢迎的。

通常我们使用ListT集合来操作,假设我们有一堆的类型为class Duck,我们可能就需要ListDuck来对其进行描述了,这样看来,问题貌似还不那么棘手。但是当我们有一堆的ValueType或者string类型的值要被组成集合的时候我们会发现问题开始复杂了,我们可以定义Liststring studentNames来装载当前要装载的学生姓名,再用Liststring studentFatherNames来装载学生的父亲姓名,这样的结果将导致我们在某些情况比如有return value的时候,一个GetName()的方法将都被定义为Liststring GetName(),因此这里的Liststring将不那么“强类型”(事实上是强类型,但是这里我指的是那种没法鉴别的情况),也许你马上要指出我的错误,你会告诉我GetName()的方法名不好,方法的命名必须遵循“表文达意”之基本守则,但我们不能保证每个人都能有良好的素养和认真的态度。一旦这样的命名被使用着,我们就必须得担心着这个结果的正确性,而它们将不会在编译时被Checked,当我们的客户拿着程序来问你为什么学生的成绩单上总是印着他们父亲的考试分数的时候,我们是应该笑还是应该哭呢?

但如果我们换一个思路来做这件事情,会不会更好呢?

interface IName

{ string Name{get;} }

class Student:IName

class StudentParent:IName

//Example:

ListStudent students;

ListStudentParent studentParents;

foreach(Student item in students)

{

;//deal with the students

}

foreach(StudentParent item in studentParents)

{

;//deal with the studentParents

}

这样我们将我们的类型更强烈化了

但有人觉得我的这个集合不会是一个复杂到需要用一个IName来指定一个string的字段,或者也不需要这么麻烦,我只想简单地将我的ListStudent表现地像Liststring一样,而又让它区别于ListStudentParent所代表的Liststring(注意,这里的两个Liststring被要求有不同的抽象意义并表示相同的物理意义),我该如何做呢?

事实上这个问题被我们思考地过于复杂,我们不需要靠着前面的例子就可以想到这样的做法,那是因为我们明白了我们要做的就是上一段最后括号里的那句话,不同的抽象意义并表示相同的物理意义。这里的相同可以由您来指定,但它至少都表示了Liststring,我的意思是你可以实现相同意外的不同方法,比如单独为你的Student和StudentParent赋予不同的方法。

下面的例子正描述着这样的一般过程:

using System;

using neric;

using xt;

namespace CA_CollectionBase

{

//

//The name of the Collection class should be defined like "BranchCollection/EmployeeCollection"

//

public sealed class SampleCollection : ListSample { }

public sealed class Sample

{

private string value;

public string Value

{

get { return lue; }

}

public Sample(string item)

{

lue = item;

}

//TODO:Describe other logic code

}

public sealed class StringCollection : Liststring { /*TODO:Describe other logic code*/ }

public sealed class Int32Collection : ListInt32 { /*TODO:Describe other logic code*/ }

public sealed class DoubleCollection : Listdouble { /*TODO:Describe other logic code*/ }

class Program

{

static void Main(string[] args)

{

//Object Type

SampleCollection sc = new SampleCollection();

d(new Sample("a"));

d(new Sample("b"));

foreach (Sample item in sc)

{

iteLine(lue);

}

//Special reference type

StringCollection strs = new StringCollection();

d("c");

d("d");

foreach (string item in strs)

{

iteLine(item);

}

//Simple ValueType

Int32Collection ints = new Int32Collection();

d(3);

d(6);

foreach (Int32 item in ints)

{

iteLine(item);

}

//Simple ValueType

DoubleCollection doubles = new DoubleCollection();

d(3.6);

d(6.3);

foreach (Double item in doubles)

{

iteLine(item);

}

}

}

}

这些代码在中同样能够得到广泛的应用,比如说我们绑定显示数据将会变得很简单

实现类ExampleClass并对其返回不同的类型,这些类型包括我们定义的集合本身,也包括通用的IList接口

public class ExampleClass

{

public StringCollection GetStrings()

{

StringCollection strs = new StringCollection();

d("string1");

d("s集成了整套视频监控设备tring2");

d("string3");

d("string4");

return strs;

}

public SampleCollection GetSamplesAsCollection()

{

SampleCollection sc = new SampleCollection();

d(new Sample("a"));

d(new Sample("b"));

d(new Sample("c"));

d(new Sample("d"));

return sc;

}

public IListSample GetSamplesAsIList()

{

SampleCollection sc = new SampleCollection();

d(new Sample("aList"));

d(new Sample("bList"));

d(new Sample("cList"));

d(new Sample("dList"));

return sc;

}

}

namespace WebAppCollectionBaseTest

{

public partial class _Default : ge

{

protected void Page_Load(object sender, EventArgs e)

{

ExampleClass exp = new ExampleClass();

//Step1

taSource = tStrings();

//Step2

taSource = tSamplesAsCollection();

//Step3

taSource = tSamplesAsIList();

taBind();

}

}

}

上面这段程序是不是就完美了呢?其实不然,当你真正去实现我注释中的TODO,去写自己的业务逻辑的时候会发现,我们并没有在期间建立起合理的连接,或者说上面那些只能做一个没有附加业务逻辑的类。我们既然是集合类,那么所有的业务逻辑都必然会操作到我们集合,但是按上面的Code我们只能在集合类的外部进行一些额外操作,至于集合类的内部,我们无法获得集合的实例(句柄Handler),因此我们也无法对它们进行操作,下面我用一个演化的过程来改进我们的类。

我们知道我们的类是继承了ListSampleClass的,那么我们利用关键字base是否可以得到句柄呢?事实上是不可以的,因为我们的List类并没有传递相关的句柄给我们。本能的我们想构造一个类,并通过它来传递这个句柄给我们。另外一种想法,就是利用原来的类通过mberwiseClone()不断提供旧有成员的克隆,并对它进行操作。不过很快后一种想法就因为居然是浅拷贝,而且只有在所有的数据被加载完之后MemberwiseClone才能返回全部的数据,否则期间将获得的数据将会是一个不完整(或者空)的数据集合。我们知道ListT类实现了IListT接口,因此我们也需要模仿ListT实现一个IListT接口,并返回ListT句柄。

薏芽健脾凝胶吃多久
排行榜
餐后血糖正常值
推荐资讯