none
繼承 RRS feed

  • 問題

  • 大大您们好,我想請問繼承的觀念,我有一個共用的class a,裡面有方法和一些變數,想要相同方法的class就去繼承他,假設有兩個類別class b, class c繼承class a,但我發現我如果先跑完class b接下來跑class c,其中他們再class a共同的變數的值,會變成相同的,也就是class b跑完,在class a的變數會直接給class c使用,請問各位大大,繼承的話會變成這樣嗎,他們的變數不會像new一個物件一樣,把參數變成預設值,不知道是自己觀念錯了,還是..,謝謝各位大大

    class a
    {
    }

    class b:a
    {
    }

    class c:a
    {
    }
    2009年3月24日 上午 07:29

解答

  • 看起來不太可能會發生你說的現象啊..
    因為繼承後,變數的空間應該是獨立的
    • 已標示為解答 冰糖旋風 2009年3月24日 上午 10:17
    2009年3月24日 上午 10:15
    版主
  • 在 C# 中,型別的資料成員(data member)被稱為 field。從資料是否共用的角度來看,可以將所有的 field 分為兩大類:instance field 與 static field。

    instance field 是在型別定義式中不含 static 修飾詞的 field,static field 則是在型別定義式中加冠 static 修飾詞的 field。

    在物件導向的概念中,型別(type,在 C# 中主要為 class 與 struct)是實體(instance)據以生成的藍圖,每一份 instance 都是 type 的單一 "案例"。

    之所以被叫做 "instance" field,是因為這樣的 field 為所有 instance 各自獨立持有。程式執行時,每一個 instance field 都佔有獨立的記憶體空間,一如持有它們的 instance。因此當某個 instance 中的 instance field 受到修改時,其它同型別之 instance 中名稱相同的 instance field 完全不會受到影響。

    而不論一個 type 被產生了多少個 instance(包括其 sub-type 的 instance),其 static field 永遠只有一份,事實上,static field 在整個型別衍生體系中都是唯一的。

    在物件導向的領域裡,instance 與 static 互為反意詞;邏輯上來說,instance field 隸屬於 instance,static field 則隸屬於 type。

    • 已標示為解答 冰糖旋風 2009年3月25日 上午 08:25
    2009年3月25日 上午 04:18
  • instance的觀念可以用底下例子來表示

    假設有個Class是用來表示房子的結構,如下
    Class Hous
    {
        int roomNumber;
        int doorNumber;
    }

    當程式要使用Class Hous時就必須如下
    Hous h = new House();
    h.roomNumber = 4;
    h.doorNumber= 2;

    以上程式用一種比較簡易的描述來比喻
    Class Hous就像是蓋房子的藍圖.
    所以藍圖內記錄著門有多少(doorNumber),房間有多少(roomNumber)..等等資訊

    但這個僅是一個藍圖,因為還沒蓋,他是不能用的.
    所以後面的new House()這個動作就是在蓋房子,而一個藍圖是可以蓋多個房子.差異就在New這個動作.所以每個New出來的房子都是不同的個體.
    當然蓋房子是要花錢的,所以在電腦中New的動作也是要花資源,這個資源就是記憶體.

    而一間房子蓋好後,可以讓每個不同房子擁有一些差異,譬如說上面的門的數量(doorNumber).
    而這些差異可以在房子建構時決定(建構子),或是事後決定(如上面的h.doorNumber =4),所以每間房子可以擁有不同的一些細節規劃.







    • 已標示為解答 冰糖旋風 2009年3月25日 上午 08:23
    2009年3月25日 上午 04:41

所有回覆

  • 小綠兒:
         你在 class a的那些變數是如何宣告的呢?
         因為從沒遇到過..好奇ing
    2009年3月24日 上午 09:36
    版主
  • 像這樣,所以是不會發生這種事的囉,是這樣嗎,謝謝
    class a
    {        
            protected bool[] M_States = new bool[8];
            protected bool[] LastM_States = new bool[8];       
            private bool FirstStart = true;  
    }
    2009年3月24日 上午 10:07
  • 看起來不太可能會發生你說的現象啊..
    因為繼承後,變數的空間應該是獨立的
    • 已標示為解答 冰糖旋風 2009年3月24日 上午 10:17
    2009年3月24日 上午 10:15
    版主
  •  嗯嗯,大大謝謝您,至少證明我之前的想法沒錯,我在自己檢查看看,謝謝
    2009年3月24日 上午 10:17
  •  觀念錯誤!
    靜態變數,靜態方法不要跟繼承稿在一起.
    靜態變數,方法通常當成工具在使用,比如Math.XXXX 這些 是在幫助數學運算,他不屬於任何變數,物件.
    坦白說.NET 是很複雜的東西.很多東西我根本不會用.但你要學好oo,我認為將一些複雜的東西去除.像我在寫如Point 這種 Class,Struct 都可做的事,我就用Class,因為Struct 我不熟. Class 的靜態變數,方法我也都很少用.因為如果不清楚整個內部流程.或像某些值是By Value,By Reference,甚至於很多多型,或介面...轉來轉去的,可能要Run 出正確的答案會很辛苦.

    2009年3月24日 上午 10:23
  • 在 C# 中,型別的資料成員(data member)被稱為 field。從資料是否共用的角度來看,可以將所有的 field 分為兩大類:instance field 與 static field。

    instance field 是在型別定義式中不含 static 修飾詞的 field,static field 則是在型別定義式中加冠 static 修飾詞的 field。

    在物件導向的概念中,型別(type,在 C# 中主要為 class 與 struct)是實體(instance)據以生成的藍圖,每一份 instance 都是 type 的單一 "案例"。

    之所以被叫做 "instance" field,是因為這樣的 field 為所有 instance 各自獨立持有。程式執行時,每一個 instance field 都佔有獨立的記憶體空間,一如持有它們的 instance。因此當某個 instance 中的 instance field 受到修改時,其它同型別之 instance 中名稱相同的 instance field 完全不會受到影響。

    而不論一個 type 被產生了多少個 instance(包括其 sub-type 的 instance),其 static field 永遠只有一份,事實上,static field 在整個型別衍生體系中都是唯一的。

    在物件導向的領域裡,instance 與 static 互為反意詞;邏輯上來說,instance field 隸屬於 instance,static field 則隸屬於 type。

    • 已標示為解答 冰糖旋風 2009年3月25日 上午 08:25
    2009年3月25日 上午 04:18
  • instance的觀念可以用底下例子來表示

    假設有個Class是用來表示房子的結構,如下
    Class Hous
    {
        int roomNumber;
        int doorNumber;
    }

    當程式要使用Class Hous時就必須如下
    Hous h = new House();
    h.roomNumber = 4;
    h.doorNumber= 2;

    以上程式用一種比較簡易的描述來比喻
    Class Hous就像是蓋房子的藍圖.
    所以藍圖內記錄著門有多少(doorNumber),房間有多少(roomNumber)..等等資訊

    但這個僅是一個藍圖,因為還沒蓋,他是不能用的.
    所以後面的new House()這個動作就是在蓋房子,而一個藍圖是可以蓋多個房子.差異就在New這個動作.所以每個New出來的房子都是不同的個體.
    當然蓋房子是要花錢的,所以在電腦中New的動作也是要花資源,這個資源就是記憶體.

    而一間房子蓋好後,可以讓每個不同房子擁有一些差異,譬如說上面的門的數量(doorNumber).
    而這些差異可以在房子建構時決定(建構子),或是事後決定(如上面的h.doorNumber =4),所以每間房子可以擁有不同的一些細節規劃.







    • 已標示為解答 冰糖旋風 2009年3月25日 上午 08:23
    2009年3月25日 上午 04:41