我准备做个进销存软件,在设计的类的时候有点问题?
往来单位(抽象基类)
客户(抽象类 继承至往来单位) 供应商(继承至往来单位)
直接客户(继承至客户) 代理商(继承至客户)
用三层
在往来单位里 有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),你觉得你会用到哪些设计模式,大致说下会怎样架构。希望哥哥们不要讲一堆大道理,设计模式的文章看了不少,能理解的,我都理解了。理解不了的你再讲一堆道理也理解不了。只希望听听大家的意见,我想自己体会体会。 说点关键的吧。。真诚学习,谢谢大家了~!
上个月刚做好一个面向对象的进销存系统,用winform做的,使用的是三层架构,里面的东西就是增删改查其他的就没什么了,感觉楼主考虑的太多了,你可以用三个界面实现:库存管理,采购管理和销售管理,我没用抽象,用接口弄的,你说的那个操作员方法多是权限的问题,你可以做个登录界面,超级管理员可以管理这三个界面,采购员只能进入采购管理,销售员只能进入管理销售。
老哥,你可能还没读懂我的困惑哟。。
@jionsoft: 那你就一语道破白!!!!
@小茶喏: 我分开说吧
Mod层
抽象类 往来单位
客户 和 代理商 这两个类继承至 往来单位
Bll层:
往来单位 抽象类 里面有个方法是
public abstract int add(Mod.往来单位 mod单位);
客户 类 继承至 往来单位
public override int add(Mod.客户 mod客户);
注意两个方法的参数,我的理解是 在 Mod层 既然说明了 客户 是 继承于 往来单位 的。那么我在 Bll层这样写参数应该是 合理的。。但是实际这样做 编译会报错。 我错在哪? 该怎么理解?
@jionsoft:如果你的客户类是继承往来单位类的话,当然可以重写里面的虚方法了!!是虚方法virtual,不是抽象方法abstract,抽象方法必须在每个非抽象派生类中重写
@小茶喏: 不管是虚方法 还是 抽象方法,都一样 我纠结的问题是 在 基类中方法的参数 是 继承类方法参数的 父类,为什么这样做不行呢? 。。关键是 父类和子类中的参数。 。
我的办法比较老土,但是有用,如下:
先做一个表, 一列为 要权限管控的 类名 其它列为 权限,比如,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);
}
一般的功能都能满足,呵呵.