The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

物件導向基礎:何謂類別(Class)?何謂物件(Object)? [解答]

上次的 物件導向基礎:何謂類別(Class)?何謂物件(Object)? 我有考各位 12 道題目,以下我就以我個人觀點回覆我自己的這 12 道題目,覺得有疑義的人歡迎提出討論。我覺得抽象概念透過不斷對話可以有效釐清不容易理解的知識與觀念,我的這些觀念也是累積好多年的經驗後才能體會(具像化)的。

1. 請問「類別」可不可以包含「物件」?

  • 基本上「類別」為「虛」,而「物件」屬「實」
  • 「類別」與「物件」兩者之間應該要有個清楚的界線,不應該混為一談。
  • 我個人認為即便是「靜態欄位」或「靜態方法」都不能算是「物件」,在物件導向的領域應該還是算類別中的「定義」而已,這些「靜態欄位」是在類別被載入 應用程式域(AppDomain) 時才變成物件的,而且靜態欄位所屬物件不需要 new 就會先佔用固定的一份記憶體空間,所以載入過多的靜態類別對應用程式來說也是一種負擔,這一點可能很多人不知道 (現在記憶體實在太大了)。
  • 本題解答:「本題無解」或「不可以

2. 請問「物件」可不可以包含「類別」?

  • 同上題解釋。
  • 本題解答:「本題無解」或「不可以

3. 請問「類別」可不可以包含「類別」?

  • 巢狀類別定義就是「類別」包含「類別」的例子。
  • 本題解答:「可以

4. 請問「物件」可不可以包含「物件」?

  • 在純物件導向的世界裡執行時所有東西都是物件,所以「物件」裡當然可以包含「物件」。
  • 本題解答:「可以

5. 請問「物件」可不可以當成資料傳遞?

  • 「物件」包含一系列的「狀態」或「資料」,要傳遞物件時必須先透過「序列化技術」將原生資料轉成可傳遞的序列化資料,然後才能當成資料傳遞。
  • 本題解答:「可以」或「不可以,除非先將物件序列化後才能當成資料傳遞

6. 請問「類別」可不可以當成資料傳遞?

  • 「類別」與「物件」兩者之間應該要有個清楚的界線,不應該混為一談。
  • 提到「資料」的時候,就不應該跟「類別」扯上關係,因為「類別」只是「定義」,「資料」是存在「物件」中的。
  • 除非你把類別原始碼也當成「資料」來看,那就算「可以」,不過這是看法角度的問題,不算正解。
  • 本題解答:「不可以

7. 在 .NET 的世界,請問「物件」可以用什麼型態存在或用什麼格式傳遞?(可任意回答一種以上)

  • 本題解答:
    • 原生資料 ( 記憶體區塊 )
    1. 序列化資料 ( XML, Binary, 自訂格式, … )

8. 在 .NET 的世界,請問「類別」可以用什麼型態存在或用什麼格式傳遞?(可任意回答一種以上)

  • 本題解答:
    • 組件檔案 (Assembly File) ( *.dll , *.exe )
    • 原始碼檔案 ( Class File ) ( *.cs )

9. 在 .NET 的世界,程式在執行的時候,「類別」可不可以被動態修改?

  • 雖然 .NET 支援動態編譯 (CodeDom) 可透過寫程式的方式動態撰寫或定義「類別」並即時編譯/載入目前的應用程式域(AppDomain),但是被定義過的類別是無法修改的,只能將組件卸載後重新載入新的組件或重新編譯修改過的類別。
  • 你試想如果被定義過的類別可以動態被修改的話,那麼 .NET 病毒可能已經滿天飛了。
  • 本題解答:「不可以

10. 如果有兩台主機要互相傳遞資料,他們傳遞的是「類別」還是「物件」?

  • 「類別」與「物件」兩者之間應該要有個清楚的界線,不應該混為一談。
  • 在傳遞「資料」的時候,資料本身即便是 字串(String) 也是個物件。
  • 本題解答:「物件

11. 請問「物件」是否包含「方法(Method)」?

  • 「方法(Method)」屬於一種「定義」,他是「類別」的一部分,並非物件。
  • 當物件要執行特定方法時,事實上去參考「類別」中定義的方法,並執行。
  • 本題解答:「不包含

12. 如果「物件」從 A 電腦傳遞到 B 電腦時,若該物件要執行「方法」還需不需要有「類別」存在?

  • 「物件」包含一系列的「狀態」或稱「資料」,要傳遞物件時必須先透過「序列化技術」將原生資料轉成可傳遞的序列化資料,然後才能傳遞到另一台電腦。
  • 「類別」是一種定義、一種參考,所以當 B 電腦得到 A 電腦傳來的資料時,對 B 電腦來說收到的僅僅是一串「資料」罷了,並非物件,若 B 電腦沒有「類別」定義的存在,便無法將這些「資料」給「反序列化」成「物件」,所以 B 電腦是需要有「類別」存在的。
  • 本題解答:「需要

-----

說實在的,這種物件基礎的問題我不知道多少人認真思考過,而且有多少人不瞭解這些觀念程式一樣寫的嚇嚇叫,如安德魯所說的:「平常都沒什麼人可以跟我討論這類問題」,我也是感同身受。

如果有人能帶領學習物件導向觀念真的學比較快,但又有多少人有機會遇到這樣的學習環境呢,我自己的程式生崖一路走來也是濛濛懂懂、跌跌撞撞的,之前都在寫 PHP, Perl 都不是很純的物件導向程式語言,直到深入研究 .NET 才能體會一些物件導向的抽象概念,我大部分觀念也是從書裡學來的,然後再從自己寫過的程式去反覆驗證,最後就會得到一個很清晰的物件導向觀念。