以下三个接口,大部分都相同,只是主键定义不一样,怎么编排它们?
是分成三个独立的接口好?
还是把公共的地方提成一个基接口,不同的地方再放到各自的接口中?
或是把这三个合并成一个接口,用不到的方法就以空代码充之?    public interface IHeaderBll
    {
        DataRow GetInfoByKey(string key);
        DataRow GetInfoExByKey(string key);
        DataTable GetListByWhere(string sAnd);
        DataTable GetListExByWhere(string sAnd);
        DataTable GetListLstByWhere(string sAnd);
        void SaveList(DataTable dt);
        void SaveInfo(DataRow rowEx);
        bool DeleteInfoByKey(string key);
    }    public interface IHeader2Bll
    {
        DataRow GetInfoByKey(string parentKey, string key);
        DataRow GetInfoExByKey(string parentKey, string key);
        DataTable GetListByWhere(string sAnd);
        DataTable GetListExByWhere(string sAnd);
        DataTable GetListLstByWhere(string sAnd);
        void SaveList(DataTable dt);
        void SaveInfo(DataRow rowEx);
        bool DeleteInfoByKey(string parentKey, string key);
    }    public interface IDetailBll
    {
        DataRow GetInfoByKey(string key, int seq);
        DataRow GetInfoExByKey(string key, int seq);
        DataTable GetListByWhere(string sAnd);
        DataTable GetListExByWhere(string sAnd);
        DataTable GetListLstByWhere(string sAnd);
        void SaveList(DataTable dt);
        void SaveInfo(DataRow rowEx);
        bool DeleteInfoByKey(string key, int seq);
    }

解决方案 »

  1.   

    我觉得相同的方法放在同一个接口就好了
    否则实现的挺麻烦的
    比如说你某个类要同时实现这三个接口
    那么对于这三个接口中的相同方法
    你要这样写:
    IHeaderBll.GetListByWhere(string sAnd)
    {}
    IHeader2Bll.GetListByWhere(string sAnd)
    {}
    IDetailBll.GetListByWhere(string sAnd)
    {}
      

  2.   

    因为只是主键定义不同,可以用GENERIC,
    public interface CommandMethod<T>
    {
       DataRow GetInfoByKey(T primaryKey);
       void Delete(T primaryKey);
       DataTable GetListByKey(T primaryKey);
    }public class PrimaryKey
    {
            
    }
    public class Header1PrimaryKey : PrimaryKey {
       public string Key{get;set;}
    }
    public class Header1 : CommandMethod<Header1PrimaryKey>
    {
      public DataRow GetInfoByKey(Header1PrimaryKey primaryKey)
      {
         ...
       }
     }
      

  3.   

    public interface IHeader2Bll
        {
            DataRow GetInfoByKey<T,V>(T parentKey, V key);
            DataRow GetInfoExByKey<T, V>(T parentKey, V key);
            DataTable GetListByWhere<T>(T sAnd);
            DataTable GetListExByWhere<T>(T sAnd);
            DataTable GetListLstByWhere<T>(T sAnd);
            void SaveList(DataTable dt);
            void SaveInfo(DataRow rowEx);
            bool DeleteInfoByKey<T, V>(T parentKey, V key);
        }
      

  4.   

    @1楼,没理解你的意思。@3、5楼,
    提取接口与提取基类一直困扰着我,因为这没绝对的提取与不提取,提取的度很难反握。以前一个主子表录入的界面我数了一下,居然用了十层继承来实现,发现继承一般超过三层的话系统结构就显得拥肿难以维护(本来继承是用来让代码更简洁清晰的)。 @4、6楼,
    觉得没什么改变反而更麻泛,而且我们这里很多电脑用的是win2000,烦型的很多功能(.net3.5)用不了。
      

  5.   

    弄些没用的东西在里边,到时人家调用 IDetail.GetInfoByKey(string, string) 怎么处理?
    实际只有 IDetail.GetInfoByKey(string, int) 这个方法有效。
      

  6.   

    @10楼,
    我还是选择第2种方法好,这样清晰点,不然后面维护的人会搞不清 IDetail.GetInfoByKey(object, object) 到底要怎么用。这不是开发的问题,是做人的问题,做人真难,左右都是错
      

  7.   

    坏啦,现在层次又多起来了。以前一个继承过十层的主子表录入界面把我整怕了,维护的时候连代码在哪层找都不知道,现在又在搞分层。Bll层我是用:interface -> abstract_class -> class,已经很多层了。
    Dal层我只是实现了几个简单的 GetDataTable(sql)、SaveDataTable(sql, datatable)、GetString(sql),且Dal层是一个封装好的完整工厂模式的Remoting三层结构:SqlBll。这里的Bll层其实是把原本应放在服务器端的Dal层提到客户端来了。
    Model模块也取消了,改为了DataRow,因为泛型不好排序、没有状态、写得太烦锁、太死板。UI层(WinForm,当然也可以用WebForm)我都不想搞什么继承了,考滤得太多了,这东东要搞到啥时?
    现在的时间基本上不是花在写界面,而是花在如何组织结构、精简代码上。在ASP时代写出一个界面算一个界面,要出新界面时 Ctrl+C & Ctrl+V 再稍加改改就OK了。
      

  8.   

    @11楼
    可以用泛型方法IDetail.GetInfoByKey<T,K>(T o1, K o2)。@12楼
    分层为了松散耦合便于迁移、代码复用,还有每个人可以关注自己的部分。如果业务不复杂变化又快、又是一个人开发,分太多层不见得好,往往一次改动引起级联修改,从上改到下,维护开发工作更大。
      

  9.   

    lz理解错我的意思了,其实我是没有十足的把握才这样讲的.
    其实总结上面各位高手的那些建议不妨采纳一些东西,既然定义了3个接口并且这3个接口中只有GetInfoKey方法签名是不同的,那么就可以将他们提取出来将它们单独声明成接口.另外,至于那些相同的东西可以封装成一个接口.
    毕竟"臃肿的接口是对接口的污染"