继承的好处例如有这样一个接口Intface A 还有这样三个类 class B,class C,class D 他们都去实现Intface A 如果后期需要对程序做修改,比如在Intface A中加入一个新方法 那么实现了该接口的三个类,都得为这个新添加的方法提供实现,要是往Intface A是多加几个方法就太痛苦于是有位老前辈便用继承与接口的概念相结合解决了这个问题 添加一个 abstart class E 让这个抽象类去实现Intface A 再让class A,class B,class C去继承abstart class E 现在如果仍需要往Intface A里添加新的规范(方法)只需让实现了该缺口的抽象类去具体实现。 另外三个子类就可以有选择地进行实现当然这也是偶老师讲的,如果楼主真不知道继承用来干啥?我想现在最起码能用在这个设计模式里
从设计的角度出发,我们确实应该避免继承,但并不能因此而说继承没有任何意义!
因此继承关系除了出现在普通的超类和子类之间,还出现在接口与子接口之间、抽象父类及其子类之间。当然了,第一种继承关系随着设计程度阶段的提升会越来越不提倡,但即使如此,另外两种继承关系,却不可能完全杜绝,而不管哪种继承关系都在一定程度上避免了重复代码的编写。
设计理念中有一种叫“Don't Repert Yourself", 就是希望你不要写重复的代码,而继承也算是其中的一种啦!
从设计的角度出发,我们确实应该避免继承,但并不能因此而说继承没有任何意义!
因为继承关系除了出现在普通的超类和子类之间,还出现在接口与子接口之间、抽象父类及其子类之间。当然了,第一种继承关系随着设计程度阶段的提升会越来越不提倡,但即使如此,另外两种继承关系,却不可能完全杜绝,而不管哪种继承关系都在一定程度上避免了重复代码的编写。
设计理念中有一种叫“Don't Repeat Yourself", 就是希望你不要写重复的代码,而继承也算是其中的一种啦!
简单一个例子:如果有个Persion类,有个实体方法eat,那么所有继承了Persion的类都可以直接使用eat方法,而不必重写。
如果你采用的是接口,那就不管了,那怕你100个类实现找个接口,100个eat方法内容都相同,你也得写100遍。
100遍和1遍,这就是选择。
还有这样三个类 class B,class C,class D
他们都去实现Intface A
如果后期需要对程序做修改,比如在Intface A中加入一个新方法
那么实现了该接口的三个类,都得为这个新添加的方法提供实现,要是往Intface A是多加几个方法就太痛苦于是有位老前辈便用继承与接口的概念相结合解决了这个问题
添加一个 abstart class E 让这个抽象类去实现Intface A
再让class A,class B,class C去继承abstart class E
现在如果仍需要往Intface A里添加新的规范(方法)只需让实现了该缺口的抽象类去具体实现。
另外三个子类就可以有选择地进行实现当然这也是偶老师讲的,如果楼主真不知道继承用来干啥?我想现在最起码能用在这个设计模式里
-------------
为什么有继承?
-------------楼主理解了这个问题吗?OO很多人在谈,不同的人理解的程度和使用的程度都不同。从设计角度来看,策略是方法,视角是方向。OO是方向,设计模式是方法。OO更贴近哲学。楼上的朋友shine333 的回复 让你多写点代码。想问下楼主写代码的时候思考是否只局限在class提供了什么?它需要什么样的功能?功能又用到哪些数据?之类云云。如果是这样shine333 的建议你是应该认真考虑下,我个人十分赞同他的观点。当你发现把自己的代码变得精简、清晰、易懂,甚至随便给个大学生他也能看出个一二三四,你就会发现你的XX语言写的代码是在借鉴人类认知世界的方式在表达客观世界。OO就是这样产生的,是为合理的表达方式而产生的。
(从这个角度上来说:软件语言顺从了大部分人类自然语言表达方式)不然,你井在自己的狭隘的思维模式中,指望有多少人能很容易的理解你。代码写出来往往只是很小的一步,多少人认可你,选择你也许要花掉你编码的几百倍的时间。包括别人愿意接受你的代码,选择修改你的代码而不是重写。
Java之父都说了,要是让他重新设计Java,他要彻底抛弃继承。
Java从C++一脉相承而来,有继承特性是理所当然的,但并不代表它鼓励你必须使用继承。就像String类有一个String(String)构造方法,但是你永远都不要去用它。
如:
public Abstract class AbstractDao {
public void method1() {
//标准sql,主流数据库都支持
} public abstract void method2();//sql不一致,如取数据库第一条记录
}public class OracleDao extends AbstractDao {
public void method2() {
//Oracle实现
}
}public class DB2Dao extends AbstractDao {
public void method2() {
//DB2实现
}
}
因为大部分sql都可以用标准的,少数部分各数据库支持不一样需要各自实现,比如DAO中有300个方法,只有20个需要独自实现,这里个人觉得还是继承比较好当然通过组合和实现接口也能实现,但是却麻烦了很多
如果你真的對oo有深刻理解,就別在這說空話,整點有意義的。上面很多人講了一堆,都跳不出我主貼里的三句話
說實話,我很失望
對你們這些程序員的失望
哲學是什麽?哲學是把所有東西的共性提取出來,把複雜的東西統一化,簡單化可從諸位上面的發言,我完全看不到。
我只看到你們管中窺豹,單從自己所看到的片面上進行長篇大論。還有,上面那幾位,連我寫過多少代碼,做過多少項目一點都不知道,就開始BB什麽我先寫代碼再來討論這些問題的,我送你們三個字:操你媽,也可多送幾個:我操你媽的2逼玩意。一副高人的樣子,只會說空話,對別人豪無了解就知道BB,你他媽的怎麼不去當官啊,不去當公務員啊?白瞎了你這齷齪的能力了
第一,我這是討論貼,不是請教貼。
第二,你可以發表任何看法,無論是對是錯,我不可能罵你。
第三,你回復的時候,首先要看清貼子,認清自己的能力,而不是看個標題就進來亂回一通,把自己定位在宗師的高度,認為別人都是沒寫過幾行代碼的學生而進行一頓豪無意義的說教。對于這種人,我不會客氣。我不喜歡說空話的人。
抽象类抽象对象(小猫、小狗)。即使撇开这些,就现在的语法来看,接口抽象能力代替不了抽象类。抽象类能包含具体的数据和具体的行为,抽象模糊的行为。这个是接口取代不了的。
如果说能把 继承和子类 两个观点完全撇开。并完美的为子类提供新的语法支持。
我还没能体会到这种可能的实现方式。所以希望 Dan1980 兄能再提供点更有意思的信息。(注:我就是一菜鸟。)
个人觉得 oop 提倡的对象抽象始终更合服情理。
--------------------
同时提供setInterface1Impl1() setInterface1Impl2() setInterface1Impl3()
--------------------
指针对不同接口的实现应该改为Interface1Impl Interface2Impl Interface3Impl
先申明,一家之言,仅供参考啊,
继承,其本质是为了重用。
接口,其本质是“协议”,规定对象与对象间的接头协议。引用一篇文章有详细说明。 http://mybeautiful.javaeye.com/blog/628672
但是有时候确实 有 是 (IS-A) 的关系, 还是继承显得更优雅。
一个例子吧,
现有一个 狗 类,
我专门 打狗的 (其他动物我不打)。我们这里又多了个日本狗, 如果它不继承 狗的话, 我将不会打它。当然,你也可以这样解决。
1.把狗跟日本狗的公共部分提出来,搞个新类XXXX,然后狗跟日本狗都组合一个XXXX.
2.提取一个接口,叫 IDog, 狗跟日本狗都实现 IDog.
3.从此我改打 IDog.
这样也能解决问题。楼主想想,这样是不是很奇怪。
继承,其本质是为了重用。
接口,其本质是“协议”,规定对象与对象间的接头协议。
个人感觉(A 继承 B),继承是定性,认定 A 是 B,使A具备B的能力。重用是从语法上来看的效果。接口本质的确可以说成是OO 语言中“协议”,或者说成“规范”。
推荐两个不错的帖子
http://www.javaeye.com/topic/3291
http://www.javaeye.com/topic/150
但即使这样 仍还是觉得紧耦合的extends有其存在的合理性
就像你说的,从更完整和自然的oo角度阐释,oo缘起某个角度可以说是人类认知客观世界最自然的方式吧
子承父,非常客观自然,子也自然而然地或者说不可抗拒地会得到父的某些遗传特征,从oo自然完整的角度可能就可以说是需要extends的,还有avoid duplicate code