首页新闻找找看学习计划

关于抽象类在三层中的应用问题,纠结啊~!

2
悬赏园豆:80 [已解决问题] 解决于 2012-04-18 16:15

我在做个进销存系统 用三层架构
实体层
往来单位(抽象类)
客户、代理商、供应商 这三个类都继承于 往来单位

业务层
往来单位(抽象类) 其中有一个方法
public abstract int add(mod.往来单位 modwldw);

然后 客户、代理商、供应商都继承至 往来单位 这个类,其中实现我以客户类举例
客户:public override int add(mod.客户 modekehu){}
代理商:public override int add(mod.代理商 moddaili){}

注意 抽象类和实现类中方法的参数,我理解的是 既然我在 实体层已经 说明了 客户 代理商 供应商 都是 往来单位的 子类,那么我在传递参数的时候 以子类代替基类应该没问题啊,在编译的时候报错了。
我自己觉得这样做很符合逻辑,为什么不行呢?我该怎么理解啊?

还有个问题就是 在设计 商品 类的时候有点问题
商品
普通商品   设备
           监控设备  打印设备  电脑及耗材

商品分为普通商品和设备,设备又分很多种,我这里应该用继承吗?如果用 那么如果 监控设备下面 又有下级分类 难道我一直继承下去。感觉不合理。。该怎么合适的使用继承呢?

问题补充:

还有个问题,做进销存肯定会 遇到 客户 订单 商品 什么的,这些东西 要提出抽象类很容易,就比如说前面问题中提到的 往来单位  客户 供应商 代理商 什么的。往来单位肯定是抽象类,想知道这种抽象关系怎么运用,用在业务逻辑层? 实体层? 怎么处理哦? 说简单点如果实体层不用抽象, 那 客户 供应商 代理商 都有编号 名称 地址 联系人等等相同的属性 难道各自分开写?

变形精怪的主页 变形精怪 | 初学一级 | 园豆:5
提问于:2012-04-17 22:08
< >
分享
最佳答案
0

我在传递参数的时候 以子类代替基类应该没问题啊,在编译的时候报错了

C#中override一个abstract方法,必须要保证签名相同,你用子类做参数违反了这个原则。还有就是我假设你的代码已经写好了(那么不如意外你想象中的客户类应该是下面这样):

class Client : //先不管它从哪个类继承
{
     public int Add(Client client)
     { 
          //也不管它的返回值是什么
     }
}

这个add方法的含义是什么?在客户类中,add一个它自身到它自身?那么这个client类是否更像是一个client列表而不是单个client?

Client clientA = new Client();
Client clientB = new Client();
clientA.Add(clientB);
//现在clientA到底代表什么意义?clientA? clientB? 两者的集合?

 如果你的回答是clientA,那么clientB被add到哪里去了?如果答案是B那么A哪里去了?如果是两者的集合,为什么2个client被作为了1个Client对象的实例?按照面向对象的思想,一个Client的实例应该在任何时候都表示1个client,而不能经常改变它的业务逻辑含义。

 

收获园豆:40
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-04-18 11:25

呵呵,这个问题问了无数遍了,只有伱听懂了我的意思,但是不全,你的第一句我理解到了。“C#中override一个abstract方法,必须要保证签名相同” 后面你给的例子中没理解, class client是指的Bll层中的 client   而 add方法中的参数 client 指的 实体层 model中的 client。如果是你来做这个你会怎么做?  model层 写3个类 客户 代理商 供应商。  然后 Bll层也写这三个类,并写增 删 改 查的方法? 但是这里3个类明明就可以 抽象出 往来单位 这个类,为什么不能应用进去了? 客户 代理商 供应商 都有 编号 名称 地址  电话 联系人等等属性啊。 分别各写各的好不舒服。 如果 抽象来做。。 实体层怎么处理? 业务逻辑层又怎么处理? 实在费解~! 望大哥指点~!

变形精怪 | 园豆:5 (初学一级) | 2012-04-18 12:50
其他回答(1)
0

如果你繼承了,抽象類,那麼裏面 要重新寫抽象的方法。參數也一樣。

再調用的時候,參數里可以賦值,繼承對象。

收获园豆:40
無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-18 09:14

老哥 没认真读我的问题哦。。

支持(0) 反对(0) 变形精怪 | 园豆:5 (初学一级) | 2012-04-18 10:59

老哥 没认真读我的问题哦。。单说 实体层, 有 客户类 供应商类 代理商类,这3个类都有共同的属性 编号 名称 地址 联系人 电话等等。。 所以我抽象出一个 抽象类 叫 往来单位,

在实体层 我写一个 抽象类 叫 往来单位 然后 供应商 客户 代理商 这三个类都 继承至 往来单位这个类 这样合理吗? 实际开发中 大家也会这样做抽象吗? 在业务逻辑层 要不要也要做这样的抽象,然后在抽象类中 写 增 删 改插这样的操作,然后在子类中 实现这些方法,但是这里的参数如何处理? 你说的 里面要重新写 抽象方法? 比如我 业务层 中  客户这个类 已经是 是  往来单位的  子类了。他应该要去 实现 往来单位类 中的方法,怎么还去抽象呢?

支持(0) 反对(0) 变形精怪 | 园豆:5 (初学一级) | 2012-04-18 11:10

@jionsoft: 抽象 是為了統一調用。實現 還是 要具體實現的。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-18 11:32

@無限遐想: 问题就是这里,抽象中 定义了方法,其中指明一个参数 mod.往来单位

实现类中 应该要去实现抽象类中的方法, 但是这里参数 是用 mod.往来单位 还是用 mod.客户 呢?

如果用 mod.客户 会报错,如果有 mod.往来单位 那么  参数 "点不出" 客户独有的属性。怎么解决呢?

支持(0) 反对(0) 变形精怪 | 园豆:5 (初学一级) | 2012-04-18 12:35

@jionsoft: 是往來 單位

這個 你需要進行轉換的。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-18 12:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册