作者godfat (godfat 真常)
看板java
标题Re: [问题] 请问interface到底是做什麽用的?
时间Fri Apr 14 05:03:44 2006
※ 引述《kazenol (随便啦)》之铭言:
: 我找了很多资料,大致上了解的是,介面是为了解决单一继承的问题、或是规范
: 出继承者必须做出介面预定的规则。
: 继承我大概了解,子类别继承之後可以使用父类别的函式与变数。可是继承介面
: 有什麽好处?如果这个介面规定要做一个jump,但是继承後jump也不能用,要去
: 写一个实际jump的方法。那我直接继承其他类别,也是可以定义jump func,为什
: 麽要绕一圈去继承一个没有内容、只写个名字的类别呢?
因为在物件导向的程式撰写里,我们常利用基类别或介面的变数去操作
另一个实际存在的子类别或介面实作者。但是有时候那个基类别其实不
需要做太多事情,也就是说,可能只有很少很少的 public method,
甚至是只有一个,更有甚者,这个实际存在的子类别或介面实作者,
他可能已经继承自另一个基类别了。这时候如果我们没有 interface
这个东西的话,就势必得用多重继承了。而多重继承在物件导向中是个
争议一直很大的东西…。也就是说 Java 利用了 interface 的机制来
解决我们对於多重继承的需求。
: 我看过一个例子,有个父class很会运动,母class很会唱歌。但是小孩子只能继承
: 父或母而变得不完美。所以定义一个介面包含会唱歌和会运动的抽象函式,然後由
: 小孩去实作,这样就算多重继承。可是第一,父类别的会运动是会讲明怎麽个运动
: 法,但是介面的“会运动“,就这三个字而已,没有说明也没有方式。第二,这个
: 介面的会运动和会唱歌除了名称以外,跟这对父母类别有关连吗?? 而且其他实作
: 这个介面的其他小孩,他们的会唱歌和会运动函式会写的一样吗?
这是个不好的例子…因为看不出来这样做的用意是什麽。就拿我前几天
在试的东西举例好了。假设我们要写一个泛型排序法,所谓泛型排序法
就是对任何有排序准则的东西做排序。那麽我们该怎麽知道所传进来的
物件具有比较能力?以下是乱写的 Java code, 不一定能跑,只是为了
呈现概念。
void sort(Comparable[] input){
if( input[0].compareTo( input[1] ) == 1 );
}
好吧,这完全不能跑 XD
我们没办法得知各种物件间需要用什麽方法来比较大小。比方说二个
个人资料,我们应该怎麽去比较他们之间的顺序?是看名字呢,还是
看编号?也就是说,我们完全没有必要去规范 compareTo 应该怎麽
实作。更有甚者,因为 Java 没有多重继承,如果你让你的物件去
继承了 Comparable, 那你原先物件的继承体系怎麽办?重写?摆烂?
然後你这一段最後一句提到其他小孩的唱歌运动是否会跟原本的一样。
基本上假使你用到了动态多形机制,意思就是你不要求他们的唱歌运动
是否一样了。所以这根本不是问题,反而是原则。动态多形就是要每个
不同的物件间行为不同而诞生的。而这个行为虽然各自不同,却有着相
同的意义。比方说你要所有的小孩表达快乐,那麽有的小孩可能是唱歌,
有的可能是运动(好啦这是很怪啦),不管他用什麽方法表达,你的命令
就只是要求他表达快乐,而这也只是你想要的。反之,就不是动态多形
要做的事,设计方向错误。
: 不好意思扯了一堆,因为我一直看不懂介面所以放弃java,没想到又在php遇上
: ,只好求各位帮我解惑。谢谢!
不懂介面的话会有很多问题喔 @_@
不过我个人认为多重继承还是有必要的… Java 的介面并没有完全解决
问题。至於其他的语言对於多重继承的解法,就我所知还有 mixin,
D 语言和 Ruby 就是以 mixin 来解决的。但不要问我 mixin 是啥,
还没研究过 XD
顺便一提,就我所知有多重继承的是 C++ 和 Common Lisp, 其他有点忘了
--
Nobody can take anything away from him.
Nor can anyone give anything to him.
What came from the sea,
has returned to the sea.
Chrono Cross
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.210.113