给笔建了个类,水笔类、毛笔类等等都继承笔类,开始觉得这样没什么问题。但发现现在都提倡使用接口,的而且确接口有很大的好处。有点想做成接口,但这样的关系做接口又感觉不对,难道把笔类做成接口,然后在水笔类、毛笔类里面把一摸一样的方法拷贝一份?这好像又违反了复用原则吧?这样的情况究竟应该用继承还是接口呢?用接口怎么做?

解决方案 »

  1.   

    用抽象类public abstract class Pen ....
      

  2.   

    To odinyeye(真正的速度) 谁说抽象类就是接口的!一般是 接口《-抽象类《—具体的实现类 这样的结构的具体的实现类一般不用于继承。这样的结构教方便代码复用,和日后的维护
      

  3.   

    如果是2层的话,接口<-具体类可以实现;如果是三层的话,我觉得接口<-接口<-具体类也可以实现,抽象类也好,接口也好,我认为在都是把具体实现抽象出来这一点上是相同的,或许C#把2者区别开来更多的是意义上的区分吧。
    跑题了,笔类显然是具体类,包含譬如长度这样的属性、write()这样的方法,毛笔类、水笔类当然也是具体类,虽然可以不用继承实现(我还是认为这里是继承的关系),但是如果应该继承的地方也不用继承,那OO里是不是可以去掉继承了呢?(存属探讨)
      

  4.   

    楼上的怎么又误导楼主呢??笔类显然是抽象类嘛。你不会说车也是具体类吧?
    笔类的write,是抽象方法,这个方法当然是要由毛笔、水笔这些具体类来实现,比如毛笔是用墨汁来write,而水笔是用墨水来write。
      

  5.   

    根据需求来,例如你的笔只是要写字,那么做成接口不错。
    但是如果你的笔,除了写,还能上墨水,测试墨水数量,设置颜色,这样一大堆可复用的操作,那就做成继承。无论怎样,原则就是怎样省代码怎么做。切忌Copy & Pastal。即使使用抽象基类来复用代码,还是可以定义接口便于其他人的扩充,例如在ADO.NET中
      

  6.   

    正好是我要问的!讨论一下!
        具体代码如下!
        有三个属性,它在所有的类中都会用到,姓名,年龄,Email
        定义一个类
        public class Details
    {
        protected string name;
        protected string age;
        protected string email;
    }
       public class someClass : Details
    {
         some方法;
    }
    谁写个接口啊!
      

  7.   

    定义一个类
        public class Details
    {
        protected string name;
        protected string age;
        protected string email;
    }
       public class someClass : Details,ISomeInterface
    {
         some方法;
    }
    //接口
    interface ISomeInterface
    {
        void some();
    }
      

  8.   

    MyLf(不睡觉的鱼) 和Ivony都有道理。
    总机一下,是不是这样?
    接口是类型无关的集合,即:很多的不同类都可以执行的操作
    抽象类是类型相关的集合,只能给同类(子类)定义的操作。
    我这样理解可以么?我也不用自己例子,就用微软的,Dispose,这个,我们希望所有的类都可以释放,我们观察一下微软如何做的,没有在Object类里写一个virtual Dispose函数,而是做成了一个接口IDisposed。是否就说明了这个抽象类和接口的用法?定义一组公用,而且无继承关系的方法,多个无法继承的类都需要遵循的方法集合,就是接口。一系列类需要遵循的方法集合,就放在基类里,必要的话做成抽象类。这样对么?欢迎讨论。