全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:7136
推到 Plurk!
推到 Facebook!

可以將Class實作interface當作垃圾回收機制嗎?

答題得分者是:leveon
hot823
一般會員


發表:2
回覆:0
積分:0
註冊:2009-01-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-02-11 01:33:25 IP:122.116.xxx.xxx 訂閱
請教各位大大 小弟是初學delphi的新手 最近剛學interface 
發現建構實作interface的Class 實體 並不須把它free掉
等他自己refrence都消失了 他便會自動free

所以可以將每個Class都實作interface拿來當自動記憶體回收嗎?
若是可以的話 有啥優缺點呢? 請各位大大幫忙指點 謝謝!!!
inungh
初階會員


發表:0
回覆:27
積分:25
註冊:2011-06-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-07-14 08:48:55 IP:70.81.xxx.xxx 訂閱
 Interface reference variables allow you to call interface methods without  knowing, at compile time, where the interface is implemented. But they are  subject to the following: 
  • An interface-type expression gives you access only to methods and properties declared in the interface, not to other members of the implementing class.
  • An interface-type expression cannot reference an object whose class implements a descendent interface, unless the class (or one that it inherits from) explicitly implements the ancestor interface as well.
------
Inung Huang
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-07-16 11:36:34 IP:118.165.xxx.xxx 訂閱
Delphi Interface 比較接近的特性是多重繼承
至於垃圾回收的演算法關鍵點在於 "之後還有沒有程式碼需要參考這個Instance"
"如果沒有 應該回收" 這點在純編譯式的語言比較難做到 如果有辦法做到這點
那程式不管怎麼寫 都不會有 Access violation 的錯誤訊息

Delphi的Owner機制
是把所有的物件裝在一個容器裡 當容器消失了 裡面的物件也應該自動消失
這總比較粗糙的就加減用
===================引 用 hot823 文 章===================
請教各位大大 小弟是初學delphi的新手 最近剛學interface
發現建構實作interface的Class 實體 並不須把它free掉
等他自己refrence都消失了 他便會自動free

所以可以將每個Class都實作interface拿來當自動記憶體回收嗎?
若是可以的話 有啥優缺點呢? 請各位大大幫忙指點 謝謝!!!
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-07-19 12:13:20 IP:59.124.xxx.xxx 訂閱
interface??
嗯!!!看看COM本質論前3章吧!!
Object的生命週期控管在這邊有詳細的說明
當然這也要搭配寫程式時作必備的搭配
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-07-19 14:42:40 IP:122.116.xxx.xxx 訂閱
  建議不用聽網友亂講看什麼本質論 
看我貼的資料就有結論了
Garbage Collector For Delphi Objects and Components
If everything implemented an interface, would this be garbage collection?
Interface 只提供一個簡單的Reference Counting
看看上面的範例
Interface拿來做GC機制 程式確變的更複雜
但得到的效果確很有限
這是Delphi的員工寫的Smart pointers
情況也是很類似 用了之後 反而會失去Delphi原有的彈性
個人認為 GC要像Java 那總由VM去做 使用者不用特別關心 才能落入實用
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-07-20 17:27:57 IP:59.124.xxx.xxx 訂閱
怎感覺好像有點人身攻擊的味道..........

戲法隨人變......觀眾愛就好.....
但演一齣人人愛的戲.......難阿.........

曾幾何時,我也演了一堆爛戲......
又曾幾何時我批評了莎士比亞的哈姆雷特是齣世紀大爛戲

===================引 用 leveon 文 章===================
建議不用聽網友亂講看什麼本質論
看我貼的資料就有結論了
Garbage Collector For Delphi Objects and Components
If everything implemented an interface, would this be garbage collection?
Interface 只提供一個簡單的Reference Counting
看看上面的範例
Interface拿來做GC機制 程式確變的更複雜
但得到的效果確很有限
這是Delphi的員工寫的Smart pointers
情況也是很類似 用了之後 反而會失去Delphi原有的彈性
個人認為 GC要像Java 那總由VM去做 使用者不用特別關心 才能落入實用
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-07-20 18:21:40 IP:118.165.xxx.xxx 訂閱
顆顆~~~連Don BOX 自己都說COM是一齣大爛戲了
船長都逃啦~~ 你要替他護航嗎
http://news.cnet.com/2100-1046_3-5148148.html




===================引 用 jcjroc 文 章===================
怎感覺好像有點人身攻擊的味道..........

戲法隨人變......觀眾愛就好.....
但演一齣人人愛的戲.......難阿.........

曾幾何時,我也演了一堆爛戲......
又曾幾何時我批評了莎士比亞的哈姆雷特是齣世紀大爛戲

===================引 用 leveon 文 章===================
建議不用聽網友亂講看什麼本質論
看我貼的資料就有結論了
Garbage Collector For Delphi Objects and Components
If everything implemented an interface, would this be garbage collection?
Interface 只提供一個簡單的Reference Counting
看看上面的範例
Interface拿來做GC機制 程式確變的更複雜
但得到的效果確很有限
這是Delphi的員工寫的Smart pointers
情況也是很類似 用了之後 反而會失去Delphi原有的彈性
個人認為 GC要像Java 那總由VM去做 使用者不用特別關心 才能落入實用
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-07-22 00:47:08 IP:60.248.xxx.xxx 訂閱
哇!!!專家耶!!!

這不禁讓我想起前不久碰到的 一群專家..........讓我大開眼界,從他們身上學到不少.........

想必專家您對於Delphi這個程式語言做到object的生命週期控管有一套獨到的實現技術.......
不知可否不吝透露一下,略為恩澤一下後輩..........




===================引 用 leveon 文 章===================
顆顆~~~連Don BOX 自己都說COM是一齣大爛戲了
船長都逃啦~~ 你要替他護航嗎
http://news.cnet.com/2100-1046_3-5148148.html




===================引 用 jcjroc 文 章===================
怎感覺好像有點人身攻擊的味道..........

戲法隨人變......觀眾愛就好.....
但演一齣人人愛的戲.......難阿.........

曾幾何時,我也演了一堆爛戲......
又曾幾何時我批評了莎士比亞的哈姆雷特是齣世紀大爛戲

===================引 用 leveon 文 章===================
建議不用聽網友亂講看什麼本質論
看我貼的資料就有結論了
Garbage Collector For Delphi Objects and Components
If everything implemented an interface, would this be garbage collection?
Interface 只提供一個簡單的Reference Counting
看看上面的範例
Interface拿來做GC機制 程式確變的更複雜
但得到的效果確很有限
這是Delphi的員工寫的Smart pointers
情況也是很類似 用了之後 反而會失去Delphi原有的彈性
個人認為 GC要像Java 那總由VM去做 使用者不用特別關心 才能落入實用
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-07-22 16:17:46 IP:118.169.xxx.xxx 未訂閱
走樣啦!
學術討論, 每個人都有自己的想法, 程式設計百百款, 未必大家都對, 也未必大家都錯, 就如之前一位領導所說, 不管黑貓, 白貓, 會捉老鼠的就是好貓, 在現實的生活中, 只要能用, 可用就是好用, 這也是我從事設計來最貼切的體驗, 所以討論就討論, 不要加入情緒, 否則就失掉了本站的用意!
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-07-22 21:22:45 IP:60.248.xxx.xxx 訂閱
同感!!!

人外有人天外有天,任何事都有一體兩面,例如固執,一面叫擇善,另一面叫頑固

我無大志,遵奉老二則學,任何一門已經被驗證且實際運用的技術才是真實的,那是赤裸裸的戰績.

從事程式已達人生的半數,也步入中年,該碰的不該碰的,基本上都碰了.........但依舊感覺渺小,依舊在仰望........最常念的 一句話"x!!這些人的腦袋裝啥阿!!!怎想得出這些高招"




===================引 用 P.D. 文 章===================
走樣啦!
學術討論, 每個人都有自己的想法, 程式設計百百款, 未必大家都對, 也未必大家都錯, 就如之前一位領導所說, 不管黑貓, 白貓, 會捉老鼠的就是好貓, 在現實的生活中, 只要能用, 可用就是好用, 這也是我從事設計來最貼切的體驗, 所以討論就討論, 不要加入情緒, 否則就失掉了本站的用意!
編輯記錄
jcjroc 重新編輯於 2012-07-22 07:28:17, 註解 無‧
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-07-22 23:35:58 IP:111.240.xxx.xxx 訂閱
不同感~
技術或工具論戰技巧 是每個程序員最後應當培養的"進階能力"
這在大到同業互相搶案競爭 小至部門人事鬥爭 都是非常受用地
技巧不好 就會流於謾罵囉


哪隻貓比較會抓老鼠根本不是重點
重點在於被留下來的到底是黑貓還是白貓?

好掌握的是技術 難以掌握的是人性



===================引 用 P.D. 文 章===================
走樣啦!
學術討論, 每個人都有自己的想法, 程式設計百百款, 未必大家都對, 也未必大家都錯, 就如之前一位領導所說, 不管黑貓, 白貓, 會捉老鼠的就是好貓, 在現實的生活中, 只要能用, 可用就是好用, 這也是我從事設計來最貼切的體驗, 所以討論就討論, 不要加入情緒, 否則就失掉了本站的用意!
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2012-07-23 01:23:13 IP:221.120.xxx.xxx 訂閱
如果技巧好就一定會勝出,那現在也不會有framework災難。
說到底,所有人最難認同的應該是您那句無理性的批判,而不在於您到底拿出什麼東西來。
還是您能跟客戶說,我的程式不但能解決你的問題還寫的比別人好一千萬倍,所以就算你的預算只有一塊錢也要付我一千萬?

抱歉本人才疏學淺,從您的那段我實在看不出本質論到底錯在哪。
其實我也不太懂COM到底哪裡像多承繼承,煩請您多指教了。
您覺得技術有問題的部份歡迎討論,但是對人不對事的,是您開頭的。


===================引 用 leveon 文 章===================
不同感~
技術或工具論戰技巧 是每個程序員最後應當培養的"進階能力"
這在大到同業互相搶案競爭 小至部門人事鬥爭 都是非常受用地
技巧不好 就會流於謾罵囉


哪隻貓比較會抓老鼠根本不是重點
重點在於被留下來的到底是黑貓還是白貓?

好掌握的是技術 難以掌握的是人性



===================引 用 P.D. 文 章===================
走樣啦!
學術討論, 每個人都有自己的想法, 程式設計百百款, 未必大家都對, 也未必大家都錯, 就如之前一位領導所說, 不管黑貓, 白貓, 會捉老鼠的就是好貓, 在現實的生活中, 只要能用, 可用就是好用, 這也是我從事設計來最貼切的體驗, 所以討論就討論, 不要加入情緒, 否則就失掉了本站的用意!
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
編輯記錄
Coffee 重新編輯於 2012-07-22 12:49:27, 註解 無‧
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2012-07-23 02:53:18 IP:111.240.xxx.xxx 訂閱

===================引 用 Coffee 文 章===================
如果技巧好就一定會勝出,那現在也不會有framework災難。
說到底,所有人最難認同的應該是您那句無理性的批判,而不在於您到底拿出什麼東西來。
還是您能跟客戶說,我的程式不但能解決你的問題還寫的比別人好一千萬倍,所以就算你的預算只有一塊錢也要付我一千萬?

抱歉本人才疏學淺,從您的那段句我實在看不出本質論到底錯在哪。
其實我也不太懂COM到底哪裡像多承繼承,煩請您多指教了。
-----------------------------------------------------------------------------------------------------------
呵呵 你可別為了打擊我就改我說的話 我說的是Delphi Interface
不是COM 原文我可是隻字未改唷
請參閱
http://programmingart.blog.51cto.com/213782/42950
事實上 其他不支持多重繼承的語言
也是有這總替代方案的說法
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/InterfaceMultiInheritance.htm
如果您不認同這總講法 可以提出您的看法
唉 打網路嘴砲感覺真空虛 還是繼續來趕報告比較實在

----------------------------------------------------------------------------------------------------------------


您覺得技術有問題的部份歡迎討論,但是對人不對事的,是您開頭的。
------
忙完 在繼續補充

以你提出的問題為例 有看過本質論的各位都知道 (笑)
COM的Interface 效果也是靠C 擁有"多重繼承"的語言特性所完成
VB本身是支援COM的 如果本質論裡面的範例 全改由VB來撰寫
會行的通嗎 ?

不講VB 那改由Delphi來做 那Delphi又是如何實現的呢??
他會和C 的做法都一樣嗎??

嗯 好啦 大家都唸過本質論 大概只有我資質愚昧 至今無法貫通 書也早就還給學校圖書館了
我只是認為沒有C 的深厚底子 沒寫過ATL RPC的人 是很難讀過本質論之後 會有所收穫的
而且書並不好找 也並不便宜 你將這樣的東西 推薦給自稱初學者的人
我沒感受到誠意 只有一股莫名的賣弄


編輯記錄
leveon 重新編輯於 2012-07-23 00:17:07, 註解 無‧
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#14 引用回覆 回覆 發表時間:2012-07-23 19:29:00 IP:59.124.xxx.xxx 訂閱
回歸主題吧
自程式語言支援動態記憶體配置開始,長久以來,因系統功能的複雜度增加及其他因數,如何有一個有效資源生命週期的解決方案變成是程式設計師的夢靨.
書裡都寫,有alloc就要有free,問題是何時才能free?隨著程式功能需求的複雜度增加,不說Multi-threaded光是Single-threaded資源free的時機越來越難以搞清楚.
COM(Component object module)的出現提供了一個解決方案(任何延伸自IUnknown的介面都稱之為COM,詳細解釋問Google大神),COM對於生命週期的管理慨念很簡單,有用到就AddRef,用完就Release,Refrence減到0就是生命終點.COM提供一個有效的生命週期管理方案,雖然實作簡單,但對於初接觸此方案的工程師於實際運用上卻是不小的負擔,因此許多高階程式語言針對資源的回收提供一個號稱自動且無感的機制.至於實際應用層面個人認為並不高.除非使用的開發語言不提供手動資源回收機制(如AS3),不然身為一個專業程式設計師,個人認為不管使用何種方式,精確掌握資源生命週期都是基本功,仰賴framework所提供的"自動"有負"專業"兩個字.
interface根據字面解釋就已經跟程式語言無關,運用在程式設計上,旨在定義一個與實作無關的物件接口定義,好讓多人開發團隊在此依據下開發系統,最終依此整合成一個完整的系統;很多人把COM與Interface畫上等號,這是不對的,猶如白馬非馬.
總的來說,Interface說的是軟體工程的解決方案,而COM的生命週期管理是一個技術解決方案,不要混為一談.
Delphi(Object pascal)語言是一個滿優雅的程式開發語言,對於AP層的程式開發幾乎難不倒,也完整的提供手動資源釋放的功能.
"萬本歸宗,程式語言只是個工具,掌握基本才是重點",僅此給眾多想踏入程式開發領域的新人
===================引 用 hot823 文 章===================
請教各位大大 小弟是初學delphi的新手 最近剛學interface
發現建構實作interface的Class 實體 並不須把它free掉
等他自己refrence都消失了 他便會自動free

所以可以將每個Class都實作interface拿來當自動記憶體回收嗎?
若是可以的話 有啥優缺點呢? 請各位大大幫忙指點 謝謝!!!
編輯記錄
jcjroc 重新編輯於 2012-07-23 05:31:57, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2012-07-24 03:00:27 IP:114.44.xxx.xxx 訂閱
 hot823,他,問的人都"不敢"說話了…

覺得差不多可以結束了 xD
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
cat200188
中階會員


發表:37
回覆:78
積分:68
註冊:2005-01-18

發送簡訊給我
#16 引用回覆 回覆 發表時間:2012-07-24 23:57:44 IP:59.126.xxx.xxx 訂閱
各位大俠 恕小的書讀的不多 但所謂的多重繼承不應該是這樣
以java為例

[code cpp]
public interface ISome {
    public void doSome();
}
public interface IOther {
    public void doOther();
}
public class SomeClass implements ISome {
    public void doSome() {
        ....
    }
}
public class OtherClass implements IOther {
    public void doOther() {
        ....
    }
}
public class SomeAndOther extends SomeClass implements IOther {
    private IOther other = new OtherClass();
 
    public void doOther() {
        other.doOther();
    }
}

[/code]
而c 更是標準的多重繼承 如下

[code cpp]
class FooA {
public:
FooA() {
cout << "執行FooA建構函式" << endl;
}

~FooA() {
cout << "執行FooA解構函式" << endl;
}
};

class FooB {
public:
FooB() {
cout << "執行FooB建構函式" << endl;
}

~FooB() {
cout << "執行FooB解構函式" << endl;
}
};

class FooC : public FooA, public FooB {
public:
FooC() {
cout << "執行FooC建構函式" << endl;
}

~FooC() {
cout << "執行FooC解構函式" << endl;
}
};


[/code]
那delphi interface 雖然看資料可以模擬 但資料未實做 如何做到標準c 的多重繼承?純屬請教 還望指點迷津 謝謝

------
.......
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#17 引用回覆 回覆 發表時間:2012-07-25 01:30:16 IP:123.193.xxx.xxx 未訂閱

[code delphi]

unit fMain;
interface

uses
Classes,
Controls,
Forms,
Dialogs,
StdCtrls;

type
IA = interface
['{37CBAAEC-925D-4685-A05C-4213F9721A97}']
function A1: string;
function X1: string;
end;

IB = interface
['{5E2E9EBD-7D29-4EF6-A2EE-2752400AD0E5}']
function B1: string;
function X1: string;
end;

TA = class(TInterfacedObject,IA)
protected
function A1: string;
function X1: string;
public
destructor Destroy; override;
end;

TB = class(TInterfacedObject,IB)
protected
function B1: string;
function X1: string;
public
destructor Destroy; override;
end;


TAA = class(TInterfacedObject,IA)
protected
function A1: string;
function X1: string;
public
destructor Destroy; override;
end;

TBB = class(TInterfacedObject,IB)
protected
function B1: string;
function X1: string;
public
destructor Destroy; override;
end;

TY = class(TInterfacedObject,IA,IB)
protected
F_A: IA;
F_B: IB;
public
constructor Create(_A: IA; _B: IB);
destructor Destroy; override;
property _A: IA read F_A implements IA;
property _B: IB read F_B implements IB;
end;

TZ = class(TInterfacedObject,IA,IB)
protected
F_A: TA;
F_B: TB;
public
constructor Create;
destructor Destroy; override;
property _A: TA read F_A implements IA;
property _B: TB read F_B implements IB;
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TA }

function TA.A1: string;
begin
Result := 'TA.A1()';
end;

destructor TA.Destroy;
begin
ShowMessage('TA.Destroy');
inherited;
end;

function TA.X1: string;
begin
Result := 'TA.X1()';
end;

{ TB }

function TB.B1: string;
begin
Result := 'TB.B1()';
end;

destructor TB.Destroy;
begin
ShowMessage('TB.Destroy');
inherited;
end;

function TB.X1: string;
begin
Result := 'TB.X1()';
end;

{ TAA }

function TAA.A1: string;
begin
Result := 'TAA.A1()';
end;

destructor TAA.Destroy;
begin
ShowMessage('TAA.Destroy');
inherited;
end;

function TAA.X1: string;
begin
Result := 'TAA.X1()';
end;

{ TB }

function TBB.B1: string;
begin
Result := 'TBB.B1()';
end;

destructor TBB.Destroy;
begin
ShowMessage('TBB.Destroy');
inherited;
end;

function TBB.X1: string;
begin
Result := 'TBB.X1()';
end;

{ TY }

constructor TY.Create(_A: IA; _B: IB);
begin
inherited Create;
F_A := _A;
F_B := _B;
end;

destructor TY.Destroy;
begin
ShowMessage('TY.Destroy');
inherited;
end;

{ TZ }
constructor TZ.Create;
begin
inherited;
F_A := TA.Create;
F_B := TB.Create;
end;

destructor TZ.Destroy;
begin
ShowMessage('TZ.Destroy');
inherited;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
O: IInterface;
begin
ListBox1.Clear;
O := TZ.Create;
ListBox1.Items.Add((O as IA).A1);
ListBox1.Items.Add((O as IA).X1);
ListBox1.Items.Add((O as IB).B1);
ListBox1.Items.Add((O as IB).X1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
O: IInterface;
begin
ListBox1.Clear;
O := TY.Create(TA.Create,TB.Create);
ListBox1.Items.Add((O as IA).A1);
ListBox1.Items.Add((O as IA).X1);
ListBox1.Items.Add((O as IB).B1);
ListBox1.Items.Add((O as IB).X1);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
O: IInterface;
begin
ListBox1.Clear;
O := TY.Create(TAA.Create,TBB.Create);
ListBox1.Items.Add((O as IA).A1);
ListBox1.Items.Add((O as IA).X1);
ListBox1.Items.Add((O as IB).B1);
ListBox1.Items.Add((O as IB).X1);
end;

end.

[/code]

aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#18 引用回覆 回覆 發表時間:2012-07-25 02:43:02 IP:114.36.xxx.xxx 訂閱
 既然還是有人問了,我就回一下了…
Interface(物件導向的概念,不是特定語言的Interface) 是指
目的:為了讓繼承者都要去實作某些定好的方法,使得所有繼承者都有同樣的方法介面。
好處:先把物件的介面定好,但不先實作內容,再依這些介面來進一步做系統設計 (此時程式都還沒開始寫)
,可以讓"未來"才會實作的物件有依規。但又可以在未來還沒發生前就開始做一系列的系統設計。
語言實作的名稱: c 裡是virtual pure class,java是interface,objective-c 是protocol…
COM元件是一種Interface的概念來的,不同語言都可以使用同一個COM元件,靠的就是"介面"的好處。
至此,Interface都和多重繼承無關。但為何常常會把Interface和多重繼承扯上關係? 原因應該是來自Design Pattern的設計理念來的。物件導向設計講的是物件的繼承,封裝,多面性等…但沒有講到這些物件該怎麼設計來"交互使用",以達成最佳化的物件設計,而這個領域就是Design Pattern學習的範疇。故,想把整個OO學精深,不僅是把封裝、繼承、多面性搞種就好,還要再學Design Pattern。舉例來說,一道菜在煮之前,如何的把食材準備好,切好,保存好…這些是物件導向學的;接著光有食材,若不知什麼菜配什菜會色香味具全,煮出來的也只能說能吃,堪吃而已。
OK, Design Pattern講了一堆後,言規正傳。在那Design Pattern裡有一個有名的叫Adapter的Pattern。用的就是多重繼承的特性來達成那個模式。若想知道Adapter有什麼好處,google一下吧。我只能簡單的講,他在事件驅動程式(有別於dos的一線到底)裡有著極重要的inter communication的功能。所以許多的framework都會實作Adapter。
問題: 由於不少的語言的framework是單根的(即不支持多重繼承),那該如何實作那超好用的Adapter呢? 於是就把Interface拿進來用。可是你會說,那把Interface拿來用和把class拿來用又有什麼不同呢? 大不同。因為Interface的引入是不含實作的部份,而class的引入會有實作的引入,於是若class可以引入,那也就不叫"單根"了!
所以簡單的來說,Interface的出現也同時讓單根的framework有更強大的能力來做Adapter之類的pattern。但Interface「不是」為了多重繼承而生,而是Interface的特性,讓它被「單根」當作多重繼承來用! Interface也可以是獨立的,而和多重繼承無關。
補充c 裡的多重繼承,c 裡要多重繼承時,沒規定只能使用virtual pure class, 他可以是一般的class。這才算是"正統"的多重繼承。不過無論是正統的,或不正統的,都可以達成Adapter,只是實作有一點點的不同而已。
至於Delphi裡的Framework就是單根的,而Interface它一開始是為COM而來(就我所知,delphi2/3時),但無論是為了什麼而創,Inteface的特色就如我上面所講的,你可以獨立使用,可以多重繼承來使用,都可以,只是多重繼承的使用會多一點(因為Adapter這道菜太好用了)。
而關於Reference count的問題…它也是正統的一種release的方案之一。目前許多語言也都有用,比如近來的Objective-C。它唯一的大問題在於 circular reference, 即若使用者不當的把A參考B,再把B參考A,這樣會死結,二個遠永不會釋放。該怎麼解決? 當然就是自己要盡量排除這樣的情形發生了。一般高級的GC是會去深入判斷是否這樣的情形有發生。
對於怎樣的釋放是最好的? 我個人覺得自己習慣哪種,就哪種好。比如對memory管理不是很熟的,就儘量不要用手動的(若可以不手動的話), 若記憶體管理很強的人,那手動通常效能會比較好,當然風險也大。如何能AV(不是女優)發生的少就用什麼樣的來處理,別能力不夠卻用難度高的來搞死自己就好。
以上是我個人對這篇文的看法。
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2012-07-24 12:50:23, 註解 無‧
aftcast 重新編輯於 2012-07-25 03:10:12, 註解 無‧
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#19 引用回覆 回覆 發表時間:2012-07-25 14:32:55 IP:118.165.xxx.xxx 訂閱
To:
大俠 Jow 你們真是超級高手 精闢解析 句句到位 我很佩服你們
PD Cofee 你們是大哥級的人物 大人有大量 有得罪之處請原諒小弟我
jcjroc 大 我相信你是願意提攜後輩的好人 大概是現實上 在以前的單位有類似不愉快的經驗
所以看到黑影就開槍
inungh .................

樓主 還有路過看過此文的各位 把氣芬弄僵打壞興致是我的錯 在此跟大家說sorry sorry (搓手)


系統時間:2017-11-20 12:01:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!