昨天交上去的作业,被我的导师臭骂了一顿,非常郁闷,昨晚一夜未眠,今天发帖请高手指点!!
  就是这个题目:现有业务A和业务B,业务A有查询、添加、删除和修改功能,业务B只有查询和添加功能,要求据此设计一个类似业务逻辑层的东西。
  老师上课说过方法的,下来让我们做,我没有按他的方法弄,而是自己发明了一个荒唐的做法!!(所以后来被臭骂了!哎)
  老师的方案如下:
  
  /// <summary>
  /// 业务A的接口
  /// </summary>
    public interface IA
    {
        void SelectA();
        void InsertA();
        void DeleteA();
        void UpdateA();
    }
    /// <summary>
    /// 业务B的接口
    /// </summary>
    public interface IB
    {
        void SelectB();
        void InsertB();
    }
    /// <summary>
    /// 业务A
    /// </summary>
    public class A : IA
    {
        public void SelectA()
        {
            //添加方法
        }
        public void InsertA()
        {
            //添加方法
        }
        public void DeleteA()
        {
            //添加方法
        }
        public void UpdateA()
        {
            //添加方法
        }
    }
    /// <summary>
    /// 业务B
    /// </summary>
    public class B : IB
    {
        public void SelectB()
        {
            //添加方法
        }
        public void InsertB()
        {
            //添加方法
        }
    }
    
    static void Main(string[] args)
        {
            IA Ia = new A();
            Ia.Select();
            Ia.Insert();
            Ia.Delete();
            Ia.Update();
            IB Ib = new B();
            Ib.Select();
            Ib.Insert();
        }
  
  我记得他上课说接口和业务最好一对一,但是我觉得这样写蛋疼得很啊,A和B都有类似的业务,要是有3000个业务每个业务都有查询、添加、删除和修改的功能,那也写3000个接口再在这3000个接口里写各写3000个这些功能的方法定义?我觉得好蛋疼的,所以我的荒唐的想法诞生了,哎,最早知道被骂,就不交了!
  我的荒唐想法代码如下:
  
  /// <summary>
    /// 接口
    /// </summary>
    public interface IT
    {
        void Select();
        void Insert();
        void Delete();
        void Update();
    }
    /// <summary>
    /// 第一遍实现
    /// </summary>
    public class ITClass : IT
    {
        public virtual void Select()
        { }
        public virtual void Insert()
        { }
        public virtual void Delete()
        { }
        public virtual void Update()
        { }
    }
    /// <summary>
    /// 业务A--重写第二遍实现
    /// </summary>
    public class A : ITClass
    {
        public override void Select()
        {
            //添加方法
        }
        public override void Insert()
        {
            //添加方法
        }
        public override void Delete()
        {
            //添加方法
        }
        public override void Update()
        {
            //添加方法
        }
    }
    /// <summary>
    /// 业务B--重写第二遍实现
    /// </summary>
    public class B : ITClass
    {
        public override void Select()
        {
            //添加方法
        }
        public override void Insert()
        {
            //添加方法
        }
    }
    
    static void Main(string[] args)
        {
            IT It = new A();
            It.Select();
            It.Insert();
            It.Delete();
            It.Update();
            It = new B();
            It.Select();
            It.Insert();
        }
  
  就是这段代码被骂惨了,哎,郁闷!我觉得很多时候查询添加修改删除功能的重复度很高啊!还有就是B业务如果哪一天想增加修改功能了,就可以在B业务里直接重写Update方法就可以了啊!哎,被批评得都不想去上课了!

解决方案 »

  1.   

    你这样做,继承基类ITClass。
    而基类实现了IT借口,它必须实现接口的所有方法,也就是说你最终的类,都会拥有
    IT接口的方法。
    而老师的方法,最终类,只会拥有实现接口的方法,这样可以控制新类的对外公开方法。
      

  2.   

    你的B里面多出了一些根本不需要的public方法,这是问题的关键。
      

  3.   


    着这个意思吗?/// <summary>
        /// 接口s
        /// </summary>
        public interface ITS
        {
            void Select();
        }
        /// <summary>
        /// 接口i
        /// </summary>
        public interface ITI
        {
            void Insert();
        }
        /// <summary>
        /// 接口d
        /// </summary>
        public interface ITD
        {
            void Delete();
        }
        /// <summary>
        /// 接口u
        /// </summary>
        public interface ITU
        {
            void Update();
        }
        /// <summary>
        /// 业务A--
        /// </summary>
        public class A : ITS,ITI,ITU,ITD
        {
            public void Select()
            {
                //添加方法
            }
            public void Insert()
            {
                //添加方法
            }
            public void Delete()
            {
                //添加方法
            }
            public void Update()
            {
                //添加方法
            }
        }
        /// <summary>
        /// 业务B--
        /// </summary>
        public class B : ITS,ITI
        {
            public void Select()
            {
                //添加方法
            }
            public void Insert()
            {
                //添加方法
            }
        }    static void Main(string[] args)
            {
                ITS Its = new A();
                Its.Select();
                ITI Iti = new A();
                Iti.Insert();
                ITD Itd = new A();
                Itd.Delete();
                ITU Itu = new A();
                Itu.Update();
                ITS ITs = new B();
                ITs.Select();
                ITI ITi = new B();
                Iti.Insert();
            }
      

  4.   


    接口不增加是不可能的,你这写的只是作业。
    你现在定义的Select,Update,Insert,Delete都是没有参数没有返回值的。
    而现实中两个业务的入参和返回值非常可能是不一样的,你不可能只定义几个增删改查的接口就把业务抽象出来,这太理想化了。
    接口不是不能增加,而是公用接口最好不要随着业务增加。当你有独特的业务的时候,接口怎么可能不增加。
      

  5.   

    LZ你连题都没看明白,不挨批才怪,题目说的很清楚了 
    业务B只有查询和添加功能就算答案写的在好,不是题目所要求的,有毛用?