台灣最大程式設計社群網站
線上人數
1786
 
會員總數:241166
討論主題:186825
歡迎您免費加入會員
討論區列表 >> VB.NET >> Class裡面一定要有屬性或欄位嗎?
[ 變換順序 ]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Class裡面一定要有屬性或欄位嗎?
價值 : 50 QP  點閱數:618 回應數:46

樓主

city
初學者
30 24
592 153
發送站內信

請問各位前輩們:

先說一下為什麼我會這麼問...

先上個程式碼:



以上是一個[類別] 裡面包含一個[方法]
它滿足了物件導向的部分條件:
1.它寫在Class裡面
2.它是個共用的方法

若以[封裝]來看:
如果這個方法寫成Private 它就算是封裝了
(外界讀不到Class1裡面的CreatDirectory方法)

若以[繼承]來看:
它可以繼承 不過沒什麼必要

若以[多型]來說:
它似乎無法多型
不過若是把Shared拿掉 它似乎就可以多型了
不過也沒什麼必要
(以上若有錯誤請指正)



類別裡的方法 似乎是只存在一份
(不會因為有很多的物件 然後每個物件都有自己的方法)
(若有錯誤請指正)

這樣看來
如果要每個物件都有屬於自己的東西 看來也只有屬性或欄位了

也就是說:
如果要滿足物件導向的封裝 繼承 多型
類別裡面就"必須"要有屬性(或欄位)?



由以上的論述所產生的問題如下:

[問題一]
類別裡面一定要有屬性(或欄位)嗎?

[問題二]
類別裡面可以只有方法嗎?

[問題三]
大大們所寫的成千成百的Class裡面 "每一個"Class裡面都有欄位(或屬性)嗎?



PS.以上是個人的想法 若大大們覺得我的想法是錯誤的 也歡迎指正
謝謝

搜尋相關Tags的文章: [ Class ] , [ 屬性 ] , [ 欄位 ] ,
本篇文章發表於2017-11-12 12:10
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
16樓
回應

羅伯斯
檢舉此回應
回樓主11F最後的5個問題
Class是否需要屬性、欄位、方法
除了依所使用旳程式語言規範外
就看Class的用途,沒有一定的法則
至於是否罕見或是常見,一樣是看用途
最後2個問題,還是看用途

總歸一句話,除了依所使用旳程式語言規範外,就看Class的用途為何
本篇文章回覆於2017-11-13 12:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
17樓
作者回應

city
檢舉此回應
To:羅伯斯+小魚

#13
可能由於時間差的關係
我在打#11內容時 大大可能已經打好#9 #10的內容
而我是在打完#11之後 才看到大大有打#9 #10


對於我#12內的Class新增資料夾 它是我實際上會用的Class

[預期的結果為何?它能達到你要的結果嗎?]

預期這個Class會新增一個資料夾 而實際上 它也做到了


[若可以你認為它是好是壞?]

說實在的..我不知道它是好的Class還是壞的Class


因為有大大說Class不該是動詞
也有些大大說這只是個副程式 不算是物件導向的Class

所以我還真的不知道它是好的Class還是壞的Class
我只知道它可以用...
本篇文章回覆於2017-11-13 13:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
18樓
作者回應

city
檢舉此回應
To:浩瀚星空

#6大大所說的[在參數的變數領域的部份,也大多是那四種]

大大可以解釋是哪四種嗎?

個人是猜:欄位 屬性 Byval值 變數(公領域或私領域)

不知大大說的四種 是哪四種?
本篇文章回覆於2017-11-13 13:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
19樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
一般來說。其中一種是一定大家都知道的。
也就是public 公開領域

其特性也就是屬於公開式的變數。其變數的值除了本身可被其它位置變數。其變數也是唯一位置性。
但一般來說並不太建議這樣的宣告。
因為宣告成這種模式,是可以從其它function或class變更變數的值。一但不小心用到同名的情況。
常常除錯會除的不知道要往哪邊處理。

所以一般來說,會宣告PUBLIC的變數。大多數而言一定是所有class都會用到的變數。不會是單一物件的特有變數。

static 他是一個很特殊性且懶的宣告方式。一般來說它的特性很奇特。又像是共用又像是私用
一般來說這個會採用靜態領域來做說明。(大多數來說,預設值很多都是這種)
基本上他跟public來說,很相同的原因是,這類的變數,可以不屬於class內的變數。
也就是程式內的變數。在程式內宣告使用某個class的情況下就會變成static
但在class內宣告,又帶有其空間的變數應用特性。
如果真要我說的話,它因該是屬於萬用性且大家也比較熟的方式
他不算是class需要的東西。但也可以宣告。也不知道這樣的說法對還是不對。

其它兩種一個是 protected 一般我會叫它為空間應用領域
他是只可在其對應的class上使用,且又可繼承到子類別上共用。
一般大多數而言都會採用這樣的方式

而private就是屬於私有領域。只可在當下的class下使用。繼承是不能的。(但可用父class取用)
我一般只會用在子類別上居多。比較特殊不能被干擾的情況上使用。

其實各家程式語言來說,大多數都是拖離不了以上這四種特性。
目前來說,有關class的宣告大多還是依 protected 為基準。

其實還有一種叫做區域性的變數宣告。但這大多數而言只會在winform程式語言中看到居多。
本篇文章回覆於2017-11-13 13:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
20樓
作者回應

city
檢舉此回應
還有一種可能會使屬性消失的原因是:

以Class矩形面積為例:



以上範例使用者很可能會直接使用類別裡的方法 而忘記先設定屬性值

為了防呆 所以改成下面程式碼:



以上程式碼 修改了New
利用New來強迫使用者輸入屬性值

這個方式 變成了使用者可以用New 以及屬性值 兩種方式來設定屬性

(不知道這個範例程式碼是否是大大們所建議的?)
(New跟屬性值都可以設定屬性)

上面的範例 屬性也可以改成Private 而不影響結果
程式碼如下:



以上的程式碼 只能由New來指定屬性
此時的屬性已經變成私有的

(這時候又有個問題:私有的屬性是否算是多餘的?)
(一個物件的屬性本該是公開的 設定成私有屬性 是否已喪失屬性的意義?)

以上範例 兩個私有屬性感覺有點多餘
似乎是可以砍掉 變成Byval值

改成以下程式碼:



以上程式碼 屬性全被刪了 只剩一個Shared的方法


事實上 以上是我目前所碰到的問題
1.變數是否該設定成屬性(還是當成Byval值就好)
2.如果有多個方法都會用這個變數 這變數如果設成屬性 那是否用私有屬性就好?
(用New來強迫給值)
3.有些變數如果要當成公開屬性 其實好像也沒必要 好像可以設成私有屬性就好 或是Byval值就好

我目前的做法是
優先順序為:Byval值 > 私有屬性 >公有屬性

1.如果變數能當Byval值 就不要把它當成屬性(用Byval來強迫給值)
2.如果多個方法都需要用到的變數 就設成私有屬性(用New來強迫給值)
3.若真的要設成公有屬性 又會面臨幾個問題:
A.要怎麼給值?
(用New來強迫給值?)
(要有幾個New?)(一個空白New設預設值 一個有Byval值的New來強迫給值?)(還是一個有Byval值的New來強迫給值就好了?)
B.如果有空白New 而使用者選擇了空白New 然後又沒設定屬性值那怎麼辦?

不知道大大們的看法如何?
本篇文章回覆於2017-11-13 14:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
21樓
作者回應

city
檢舉此回應
To:浩瀚星空

原來大大說的變數領域指的是這個...

跟我原本想的差太多了 哈哈


大大解釋的非常詳細...都可以當教科書了
本篇文章回覆於2017-11-13 14:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
22樓
作者回應

city
檢舉此回應
補充一下#20

Class矩形面積也可以有多個New 例如:



以上有兩個New
這會碰到我在#20所說的問題:

[如果有空白New及有Byval值的New 而使用者選擇了空白New 然後又沒設定屬性值那怎麼辦?]
本篇文章回覆於2017-11-13 14:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
23樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
我只覺得~~~~你還是不了解我跟其他大大們對你說的話。

你不是要開發一個程式語言。你是想要用程式語言做開發。
不要想要挑戰程式語言的規範。
不要自已轉彎解釋用法。

我要我說看完你在#20的說法的感想嗎??
我只會跟你說,你煩腦錯地方了。
你一直一味的還在這邊傷腦筋。

或許可以給你提示一下。一般的class宣告內,會保留幾個特定方法。
其中一項叫做初始值方法。(你可以自已找一下)
此為無論你目前呼叫何種方法。都會先行運行的方法。
所以你可以將一些必要的參數放在此做好宣告。
再利用操作特性來處理就行了。
本篇文章回覆於2017-11-13 14:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
24樓
作者回應

city
檢舉此回應
To:浩瀚星空

#23
首先:我沒有要開發一個程式語言(這應該很明顯..哈)

其次 我整篇討論的其實也都是:怎樣寫好一個Class

我#20的內容也是我實際上碰到的問題:如果要寫一個Class矩形面積 我該怎麼寫?
我寫了5種方式(事實上還可以更多)
而為什麼會那麼多種方式
就是在寫第一種的時候 發現不妥 好像有漏洞
於是就開始寫第二種
第二種發現還是不妥 還是有漏洞
就寫第三種
...
...
而每種方式都有它面臨的問題 我只是把問題提出來
而我的目的也只有一個:寫一個沒有破綻的Class矩形面積(並且讓使用者不會忘了輸入變數)


另外

[一般的class宣告內,會保留幾個特定方法]
這指的是什麼? 我只知道New... (好像還有一種是解構函式...)

[初始值方法]
目前只知道屬性可以設初始值
Public Property w As Double=30

其它的初始值方法..我再查查好了
本篇文章回覆於2017-11-13 15:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
25樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
其實在#5的羅伯斯 早就給你正確的答案了。

你目前的情況,就是在還未了解有關物件的架構。
也就是說,你還不清楚金屬片的製作原理跟方式。
就一直再問怎麼去彎它,凹它。

其實這些答案,一但你了解物件架構的原理。就自然的知道該如何去處理你目前的問題。

你就像是一直再問水管怎麼流出水。但一直不想去學要先將水管接上去水龍頭。
還在那邊問水該怎麼去控制大小。怎麼捏水管。

但實際上只要控制水龍頭就可以解決的問題。

之後再來學怎麼接噴嘴做出花樣都還來得及。

但至少先學會怎麼將水管接上去水龍頭吧。

我不知道你是否很清楚我目前的說法。其實上面很多大大們都一直再告訴你答案。
但你一直都還不自知。

簡單來說真要學比較狠一點話。你現在問這些都是多餘的。
因為這都是代表你對於基本的東西不清楚不了解。
你要學的是根本的東西。而不是用自已的方式來理解你想聽的答案。

這會走火入魔的。
本篇文章回覆於2017-11-13 16:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
26樓
回應

羅伯斯
檢舉此回應
to 24F:
任何的程式,不可能一開始就完美無缺的
總會有不預期的狀況發生,而必須對原來的程式,進行修改動作
如果說程式一開始就完美無缺,那對許多的系統維護師而言
將會是一場大災難,因為他將會是第一個被遣散的人

開發一套軟體,總有時限上的壓力存在,為了趕在限期內完成,自然會忽略一些細節的處理
而這些細節,初看好似沒啥影響,但它就有可能是個漏洞
若干時日之後,整個軟體可能因這些未處理的細節,發生嚴重性的問題
所以就會有發行後的改版或增補程式發行,以改善軟體的缺陷

以Windows為例,就有許多的漏洞存在,若微軟放任不管,駭客利用這些漏洞,所造成的危害
將會令任何使用者都無法承受,並將Windows視為毒蛇猛獸,避之唯恐不及
如此微軟此將很難生存,必竟Windows的營收,對微軟而言,有其極為重要的貢獻
本篇文章回覆於2017-11-13 17:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
27樓
最有價值解答

史努比
檢舉此回應
物件導向講求的是用類別來設計專職專責的元件來處理某些事情, 每個小類別在運作時,

可能需要一些資料或是需要和其它的類別實體進行配合, 這些可以用屬性或是方法參數來傳遞,

最後再由最上層或最外部的類別將所有的小型類別整合在一起變成一套系統,

樓主老是執著在類別該不該用這樣的語法來設計, 卻不去思考我新增這個類別 實際的責任為何?

你可以回頭仔細看看自己設計的類別中, 那一個你能講出他一項最主要的功能, 而且這個類別只負責這功能相關的程式,

而且他的名稱讓人一目了然, 又接近自然語言的 那就是個好類別, 好設計,

類別提供這麼多種方式來讓你設計內容, 就是要讓你自己依不同的需求來彈性的調整架構

而你偏偏要執著在其中幾種, 然後不斷去討論做什麼對不對 做什麼該不該,

如果你覺得不對, 或是不應該, 那就別用嘛, 程式是你在寫, 你自己想要卡死自己, 我們也救不了你

要討論也可以, 但是請先提供一個實際的情境, 完全沒情境要怎麼討論出一個有結論答案?

要不要實體方法, 我舉個例子, 好比考試卷這個類別的分數欄位,

你應該設計成 :

每張考卷的資料都有一個 Score 的實體屬性呢?

還是寫一個靜態方法在類別裡, 每次要知道分數就要把考卷中所有答案都送去這個靜態方法算一次呢?

想也知道, 成績算完了, 當然直接存入實體裡, 沒必要每次要取得分數, 都得把考卷送去都重算分數一次,

在這個範例中當然是有個實體的property是最好, 每張考卷都可以儲存不一樣的分數

又如果你寫了一個類別 Math, 想要存放所有跟數學運算有關的方法,

這時你如果 把Add(int a, int b) 做成類別實體方法那就是個爛設計了

1. Add 方法日後需要override的機會等於零, 除非這世界的加法被重新定義了

2. 考量其它人在調用此方法的方便性, 不用每次要做個加法, 還得先new 一個Math物件出來

3. Math物件, 有沒有可能被當成參數來傳遞給其它類別? 好像也沒啥必要

4. 參數a, 參數b 儲存在Math裡的再利用性價值太低, 也不會儲存在Math裡,

基於以上三點, 我會決定把Add做成靜態方法。


程式想怎麼寫都是個人風格, 沒有絕對的對或錯, 而且別人講了你也不一定會聽,

你有沒有發現你路越走越偏了, 越來越不知道該怎麼開始寫程式了?

每種寫法都有在不同情境有著不一樣的優缺點, 不要執著在應該怎麼寫最優秀,

因為根本就沒有最優秀的語法, 只有最適合的語法,

你應該先把思慮放在「面對這個情境, 我這樣寫的自不自然, 日後好不好維護, 彈性夠不夠」

本篇文章回覆於2017-11-13 19:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
28樓
不錯的參考

誰是誰
檢舉此回應
找一個夠大的專案 (就是那種要寫個半年一年的),寫好交出去後接著再維護三年。
很快你就會知道該怎麼寫了.
本篇文章回覆於2017-11-13 19:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
29樓
作者回應

city
檢舉此回應
To:史努比

個人覺得大大說的很好...


[最後再由最上層或最外部的類別將所有的小型類別整合在一起變成一套系統]

這個大大可以簡單示範一下嗎? 謝謝



[你可以回頭仔細看看自己設計的類別中, 那一個你能講出他一項最主要的功能, 而且這個類別只負責這功能相關的程式]
[而且他的名稱讓人一目了然, 又接近自然語言的 那就是個好類別, 好設計]

類別名稱:Class新增資料夾
只做一件事:新增一個資料夾
類別名稱是個動詞

這樣算是好類別 好設計嗎?





[類別提供這麼多種方式來讓你設計內容]

這麼多種方式指的是什麼方式?

謝謝~~
本篇文章回覆於2017-11-14 09:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
30樓
作者回應

city
檢舉此回應
To:誰是誰

還蠻有道理的...


不過目前還遇不到這樣的專案 哈
本篇文章回覆於2017-11-14 09:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   

回覆
如要回應,請先登入.