首页 新闻 会员 周边

进销存软件中类的设计疑惑

0
悬赏园豆:50 [已解决问题] 解决于 2012-04-18 16:14

我准备做个进销存软件,在设计的类的时候有点问题?

往来单位(抽象基类)

客户(抽象类 继承至往来单位)                           供应商(继承至往来单位)

直接客户(继承至客户)         代理商(继承至客户)

 

用三层

在往来单位里 有4个抽象方法

abstract add(往来单位 wldw);

abstract delete(往来单位 wldw);

abstract edit(往来单位 wldw);

abstract select(往来单位 wldw);

客户里 也有这个4个抽象方法,但是具体的实现在客户的子类 直接客户 中。注意 直接客户中的 4个方法的参数

 

overide add(mod.直接客户 zjkh){}

overide delete(mod.直接客户 zjkh){}

overide edit(mod.直接客户 zjkh){}

overide select(mod.直接客户 zjkh){}

 

根据我的理解,这样是应该没为题的  A是抽象基类, B是继承至A的抽象类,C继承至B类。那么我在C的方法中使用的参数本来是应该是可以替换 基类中的参数啊。。为什么这样 做会报错呢? 我错在哪?

 

还有个问题是,按逻辑来说,订单是应该由操作员来做的。所以 订单的操作(增 删 改..) 的方法应该写在 操作员 这个对象里。

意思就是 操作员 这个类里 有一个方法 addorder(mod.order morder) {}

但是如果按这种思路, 软件里的所有任务基本上都是 操作员来做的。 那么 操作员 这个类里面会 存在很多 很多 很多的 方法了。 我看很多案例里都是 把各自的 方法 写在 各自的 类里。即 订单的操作,写在订单这个类里面的。 这里应该怎么做,怎么去理解呢?

问题补充:

另外还想问一下:如果是你来做一个基本的进销存软件,不考虑多数据(只用mssql),你觉得你会用到哪些设计模式,大致说下会怎样架构。希望哥哥们不要讲一堆大道理,设计模式的文章看了不少,能理解的,我都理解了。理解不了的你再讲一堆道理也理解不了。只希望听听大家的意见,我想自己体会体会。 说点关键的吧。。真诚学习,谢谢大家了~!

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

上个月刚做好一个面向对象的进销存系统,用winform做的,使用的是三层架构,里面的东西就是增删改查其他的就没什么了,感觉楼主考虑的太多了,你可以用三个界面实现:库存管理,采购管理和销售管理,我没用抽象,用接口弄的,你说的那个操作员方法多是权限的问题,你可以做个登录界面,超级管理员可以管理这三个界面,采购员只能进入采购管理,销售员只能进入管理销售。

收获园豆:40
小茶喏 | 菜鸟二级 |园豆:274 | 2012-04-15 19:30

老哥,你可能还没读懂我的困惑哟。。

变形精怪 | 园豆:5 (初学一级) | 2012-04-15 23:56

@jionsoft: 那你就一语道破白!!!!

小茶喏 | 园豆:274 (菜鸟二级) | 2012-04-16 08:49

@小茶喏:  我分开说吧

Mod层

抽象类 往来单位  

客户 和 代理商 这两个类继承至 往来单位

 

Bll层:

往来单位 抽象类 里面有个方法是 

public abstract int add(Mod.往来单位 mod单位);

 

客户 类 继承至 往来单位

public override int add(Mod.客户 mod客户);

 

注意两个方法的参数,我的理解是 在 Mod层 既然说明了 客户 是 继承于 往来单位 的。那么我在 Bll层这样写参数应该是 合理的。。但是实际这样做 编译会报错。 我错在哪? 该怎么理解?

变形精怪 | 园豆:5 (初学一级) | 2012-04-16 23:10

@jionsoft:如果你的客户类是继承往来单位类的话,当然可以重写里面的虚方法了!!是虚方法virtual,不是抽象方法abstract,抽象方法必须在每个非抽象派生类中重写

小茶喏 | 园豆:274 (菜鸟二级) | 2012-04-17 13:30

@小茶喏: 不管是虚方法 还是 抽象方法,都一样 我纠结的问题是 在 基类中方法的参数 是 继承类方法参数的 父类,为什么这样做不行呢? 。。关键是 父类和子类中的参数。 。

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

我的办法比较老土,但是有用,如下:

先做一个表, 一列为 要权限管控的 类名 其它列为 权限,比如,AA,AB,AC,AD,AE

在每个需要加权限的窗体类下面加上下面这个函数,

  public void quanxianq(Form frm) //查看,保存,修改,等权限控件
        {
            string formname = frm.Name; //获得窗体名称           
            string commandsql = "select * from aquanxian where nameid = '" + command.Class1.ename + "' and formname = '" + formname + "'";
            sqlDataset.Class1 sqlclas = new sqlDataset.Class1();
            DataTable dtt = sqlclas.adt(commandsql);
            DataRow thisreader = dtt.Rows[0];
            //开始如果没有权限,就不启用            
            if (Convert.ToBoolean(thisreader["AB"]) == false)
            {
                AB.Enabled = false;
            }
            if (Convert.ToBoolean(thisreader["AC"]) == false)
            {
                AC.Enabled = false;
            }
            if (Convert.ToBoolean(thisreader["AD"]) == false)
            {
                AD.Enabled = false;
            }
            if (Convert.ToBoolean(thisreader["AE"]) == false)
            {
                AE.Enabled = false;
            }
            if (Convert.ToBoolean(thisreader["AH"]) == false)
            {
                AH.Enabled = false;
            }
            if (Convert.ToBoolean(thisreader["AI"]) == false)
            {
                AI.Enabled = false;
            }
            if (Convert.ToBoolean(thisreader["AJ"]) == false)
            {
                AJ.Enabled = false;
            }
        }

 

在窗体的加载事件里,把这个函数写进去

 private void Cbom_Load(object sender, EventArgs e)
        {            
            //权限控制
            quanxianq(this);

}

一般的功能都能满足,呵呵.

收获园豆:10
zhengyingcan | 园豆:12 (初学一级) | 2012-04-16 11:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册