2014年4月14日 星期一

[Code Review] Team 06 - Hw06


TextBox的顯現有參考第二組的寫法.
執行檔
專案檔


Form1.cs
Object3D.cs
Cube.cs
Ball.cs
Cylinder.cs
Pyramid.cs

5 則留言:

  1. 第8組
    Shape3D裡面存了很多參數(lenght,radius....等)但有些子類別會使用不到,是否考慮加入在子類別內會更好 ?

    回覆刪除
  2. 同第8組的看法,因為這樣反而是讓父類別涵括了所有子類別的欄位,雖然程式看起來比較簡短,但感覺不符合繼承原有的初衷。另外,金字塔的體積計算公式好像有點問題?

    回覆刪除
    回覆
    1. 會選擇這樣做是為了滿足介面,讓使用Object3D宣告成的陣列也能印出length,radius,height這些參數.
      有想過也能在一開始就先宣告陣列,再輸入資料同時記錄參數,但是這樣太浪費空間.
      後來第八組的朋友有跟我說可以看看你們第二組用的list. 我有空會再改進.
      金字塔的計算公式少除3,我現在改好放上去了.

      刪除
  3. Form1.cs 架構簡潔,非常容易辨別事件的內容!
    LIstView 有點睛的效果!

    許多 Shape 的 .cs 檔內的含有參數建構子 ( 例如:長度、半徑‧‧‧等 ),刪除後程式仍可執行。
    請問於子類別撰寫參數建構子有任何用途嗎? (若只是練習為目的就不再此討論範疇內

    回覆刪除
    回覆
    1. 謝謝囉!
      原本在父類別Object3D.cs裡面沒有加入對邊長,半徑那些欄位作存取的屬性. 後來就如上面回答到的,想要試試看在listview那邊連邊長,半徑這些一開始輸入的資料都能印出來,所以才又在Object3D.cs裡面加入虛擬的屬性,讓每個形狀的子類別能夠在介面靠父類別的陣列呼叫出自己獨有的欄位.(類似像在把父類別包含的東西廣泛化,最後輸出時在去判斷父類別陣列存的是哪個子類別,然後再去呼叫那個子類別獨有的東西. 不然只靠原本的父類別無法連邊長、半徑那些都抓出來. 但是這樣似乎也和物件導向的概念有點脫節,因為父類別不該擁有子類別獨有的東西,而現在把父類別擁有的東西廣泛化,那所佔的記憶體就會更大.)
      不過因為目前的版本中,父類別的虛擬屬性有寫出return邊長、半徑那些欄位,和子類別的覆寫屬性的內容相同,所以才會覺得把子類別內寫的屬性刪掉也沒關係. 如果原本父類別的虛擬屬性作的只是初始化,沒有實際return我們要的東西,像是
      public virtual double Length()
      {
      get {return 0.0;} //類似只做初始化,真正需要處理存取時再由子類別的屬性去做
      }
      這個時候,如果把子類別的override屬性刪掉,那form1.cs: ShowResult()呼叫到的ObjectData.SubItems.Add(ObjectList[i].Length.ToString())就只會執行父類別的虛擬屬性. 這樣實際執行後,cube的邊長顯示就一直是0.

      刪除