子类中添加父类型没有的接口在开发过程中很常见,但是个人感觉这样的用法损害了多态的优势,各位高手们怎么看?
看需求.合适的才是最好的.没有一种方式规则可以应对所有业务.
这个和多态没多大关系。派生类实现额外的接口表明它有其他功能,完全根据你具体场景来。
比如我自定义一个exception(从Exception派生),同时我想自己控制序列化过程,那么我实现ISerializable接口(额外添加序列化特殊的构造函数)。
不怎么看,所有类都是从object派生的...IList...Object都没有。
语言的设计不是因为“对象”而“对象”,只是一种工具,设计上的合理也只限于某一些场合;概念原本是没有的,都是为外围的使用者设定的。比如你用Flash有影片剪辑这个概念,PS没有这个概念;Android有Activty,Windows没有...但倒推回去n层后,他们的底层(原理或接口)是相同的。
c#和java和c++的多重继承来说 —— 也是那么回事,多重继承就一定不好吗...但总的来说,进化升级肯定是带来某些方便的,有体力上的,记忆上的,管理上的...
因此站在使用者的角度,你思考的问题的方向反了,除非你发现语言比较大的劣势[功能],你以上的思考就有了意义(后半句意味着你将是语言工具创造者,为什么说比较大,因为同质化的产品没什么市场)。
从c++语言这门语言的语法角度上看,子类中添加父类中没有的接口是没有问题的,但是我在日常的开发中发现如果我们这样做了,就不能在所有的地方去使用父类类型的指针或引用去掉用子类中新添加的接口,必须转化成显示转化成子类的指针或引用才行,这样感觉很不方便
@pig&dog: 你这才不合理,像你说的这种情况往往这个结果值是动态运算出来的,那么在coding的时候怎么知道什么类型,代码无论如何是死的。好吧,假设按照一种方便的方式,继承的概念变了 —— 对父类都是扩展,所有类都是长得一样的超级大类...不好玩吧。
不过,不过 —— c#有种玩法,叫扩展,你只要对父类(或者接口)进行扩展,都能玩。
@花飘水流兮: 我认为不会出现你说的超级大类呢,出现超级大类也就是所谓的上帝类并不是因为对父类都是扩展造成的呀!而是封装类的时候粒度太大,类的功能不单一。
从c++语法的角度看,继承是不需要把所有的接口都定义到父类中,然后在子类中扩展这些接口的。但是多态的作用感觉被消弱了。
各回各家,各找各妈才是合理的