类的设计问题

时间:2021-05-17 15:27:12

 

虽然搞.NET已经有N年,好像是从C#出生就开始了。可是因为只是业余,只是爱好,都是自摸的,到现在连个类都设计不好,很是郁闷啊!还好,现在知道有博客园这个地方来学习解决问题了。

本人闲着没事干,于是想设计一个超级平台来协助处理日常工作、生活、学习、娱乐等各方面的问题,而且想采用最新最快捷的技术,比如WPF、Silverlight、ORM等。于是开始着手,这几天就碰到了这样的一个问题,也许我这样做本身就是问题,只有请各位大侠指点。

现在有一消费类Expense用于消费记账,其中它需要用到一个账户Account来支付。可用于支付帐户的类型有信用卡CreditCard、现金Cash、支票Check等等。

每次记账,我需要将所使用的账户信息存储起来以备查询或统计,于是Expense需要有个Account的属性。

我这里想了两个方案,一个是将ExpenseAccount设计为接口或抽象类,而CreditCard等一干账户类型都实现或继承于它。二是设计ExpenseAccount为一个类,而这个Account类有个Category属性,这个属性设计为接口或抽象类,然后CreditCard继承于Category

我这里最不好解决的问题是将要保存的信息存储到像MS SQL Server这样的关系型数据库中,再有不好解决的问题是如何从数据中取回并生成相应对象的问题。比如,如果用第二种Account表的Category字段存储的内容是什么呢?如果将它设置成账户类型的名称,如CreditCard,然后子表CreditCard关联到父表Account倒可解决存储的问题,可是取回时又成问题了,因为CreditCard的数据无法恢复。

 以下是我设计的数据库实体图

类的设计问题

 

还有一个类似的问题,就是中国的行政区划。

中国的区划比较复杂(整个世界的都是,中国更甚),是一个不规则的组织结构或者树。

我是这么考虑的:

1.最顶层的是*,其属性有名字、首都、语言、文字、货币......

2.接着是省一级的行政单位(省、自治区、直辖市,香港也算这一级,可是有货币属性,文字也不一样),其属性有的有省会(直辖市又没有)、国家...

3.然后是市这一级(市、自治州),属性有名称、省、地理坐标...

4.县一级(县、市、区、旗、自治县等等...——复杂吧,名称很多,中国特色),属性有名称、市(这里面还有省直接管辖的,就不好搞了)

5.乡一级(乡、镇、街道......

6.村一级(居委会.....)   

开始我设计了六个类,后来想如果外国人加进来怎么办(我是设计联系人的时候要用到地址,还有在GIS地图里要用到),我所了解的美国好像不是这个结构的。于是我就将行政区设计成一个类District,其中有个属性为抽象或接口类型DistrictCategory,还有Name(string)Capital(District)HigherDistrict,上级)等属性,然后上面说的6种类型的行政区CountryProvinceCityCounty等等都继承自DistrictCategory,它们包含自己独特的属性。比如在国家和市这一级里有电话区号,村有邮政编码等等属性。行政区之间的关系由其District类型的Higher属性来确定。

这里我也遇到了一个持久化和取回的问题,都与DistrictCategory类型的Category属性有关。首先是持久化,这里要设计7个数据库表,我想省事用O/R框架好像不行,对象存储时要根据不同的类别存储到不同的表里。接着是取回的问题,我根据一个DistrictName属性查询到了这个相应的记录,可是我无法知道其相关的属性到哪个表示类型的表里面去找,至少不能用程序表达。

示例如下:

     District china = new District();

china.Name = "*";

Country country = new Country();

country.Abbreviation = "PRC";

china.Category = country;

 

District zhejiang = new District();

zhejiang.Name = "浙江";

Province pro = new Province();

pro.Type = ProvinceType.;

zhejiang.Category = pro;

zhejiang.HigherLevel = china;


如果要是取回,我是找到了浙江这条记录,可是程序如何知道

 

请各位帮助解惑啊!