Re: 請問陣列的宣告…

看板java作者時間20年前 (2004/06/21 20:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/11 (看更多)
> 我一直希望 C/C++ 能夠把他化簡成 > function fa (x) > { > if (x % 1) > { > cout << "Yes!"; > return 1; > } else { > cout << "No!"; > return 0; > } > } 用template+轉型設施已經可以達成你要的效果, 而且還有type-safe的優 點 如下: template<typename P> int fa(P& x) { if (x % 1) {...return 1;} else{return 0;} } int i= fa(1); class1 c1= fa(1); //class1中必須定義建構式 class1(int i), // operator=(int i); class2 c2= fa(class3()); //class2 中必須定義建構式 class2(int i) , // operator=(int i); // class3必須定義 operator % 這樣的作法跟script的差別就在於script用一個共通的type來函括所有type (如vb的variant, js的var) 所以當函式回一個共通的type時,他可能是 int, 可能是char, 可能是一個object, 這時程式要怎麼處理就完全依靠 程式"內隱"的規則. 例如, function func(x) { if (x==1) return CreateObject("xxx.xxx"); else return 1;} 請問, 呼叫func的客戶端要怎麼能知道他拿到的是int還是 object? 答案是客戶端得去了解func的實作內容. 這樣的情形嚴重的傷害到程式 的封裝與抽像特性. 所以script並不適合開發大型程式. 而使用c++, 你可以使用template讓function享有類似script的彈性 又不損及type-safety及runtime performace. 댊 high-level, type-safety, efficiency是c++的特性, 要讓c++改用 script的方式就好像叫c++自廢武功一樣 至於你下面所提的例子, 事實上script的變數並非沒有型別, 而是他們都是繼承至同一個共通的型別,好比是java跟.net的共同基底類別 vb的variant也是類似的觀念. 而script把這類別的宣告藏了起來,好讓程式 簡化. 所以以下面的c++程式來看, c++也只是把這之間的關係描述出來. 你可說c++很繁瑣, 但是至少, 在程式中描述出來的繼承關係, 可以讓 compiler提早揪出錯誤的型別使用. 減少在runtime出錯的可能. 更可加強 程式的可讀性,結構性,邏輯性. 你可以想像一下, 如果dynamic傳回 的一定是bicycle or car之類的交通工具, 為何不在程式明確的指出 dynamic只會回傳交通工具這件事 ,卻要讓使用者冒著可能不小心把回傳 的交通工具當成建築物來使用的風險, 其道理何在? 另外, union的作法絕對是最差的,完全不用考慮. > 深入範例:(很重要的編程風格範例) > 嘗試思考下面這個例子: > function dynamic (x) > { > if (x % 1) > return Bicycle(x); > else > return Car(x); > } > 這可好了,編譯器該如何做?我嘗試著將上面的函式翻譯成 C++ > 解法一:使用基礎類別再加以繼承之。 > class CC { …略… } ; > class Bicycle : CC { …略… }; > class Car : CC { …略… }; > template<class T> > CC * dynamic(T x) > { > if (x%1) > return new Bicycle(x); > else > return new Car(x); > } -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: NK219-91-119-85.adsl.dynamic.apol.com.tw
文章代碼(AID): #10riu100 (java)
文章代碼(AID): #10riu100 (java)