﻿# 物件導向基礎：何謂類別(Class)？何謂物件(Object)？ [解答]

上次的 [物件導向基礎：何謂類別(Class)？何謂物件(Object)？](/post/2009/08/27/OOP-Basis-What-is-class-and-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](http://msdn.microsoft.com/zh-tw/library/f1dfsbhc.aspx)) 可透過寫程式的方式動態撰寫或定義「類別」並即時編譯/載入目前的應用程式域(AppDomain)，但是**被定義過的類別是無法修改的**，只能將組件卸載後重新載入新的組件或重新編譯修改過的類別。
-   你試想如果被定義過的類別可以動態被修改的話，那麼 .NET 病毒可能已經滿天飛了。
-   本題解答：「**不可以**」

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

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

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

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

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

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

\-----

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

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