台灣最大程式設計社群網站
線上人數
1038
 
會員總數:244578
討論主題:188713
歡迎您免費加入會員
討論區列表 >> VB.NET >> 繼承.NET Framework 複寫屬性方法的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
繼承.NET Framework 複寫屬性方法的問題
價值 : 100 QP  點閱數:348 回應數:8

樓主

city
初學者
130 40
1425 224
發送站內信

各位前輩們好:

一直有個疑問 (以下敘述若有錯誤請指正)

假設自訂了一個Class1 繼承了Button類別

==================================================
如果在Class1新增[屬性] [方法]
這樣子我還可以理解
雖然我沒有實際運用這種方法
不過我隱隱約約感覺到Class1會變成一個超強的類別
簡單的說 就是會變成Button類別+資料庫

不過這樣的方法
已經讓Class1失去了Button的特性
變成了一種複合式的類別

因此 我的第一個問題是:
[實務上 會有人這樣子做嗎?]
[這樣算是特例還是常用手法?]

==================================================
其次
微軟並沒有開放Button類別的原始碼(若有錯誤請指正)
如果Class1修改了Butoon的[屬性][方法]
能看到的 也只有 MyBase.屬性 MyBase.方法

例如:


假設要修改BackColor屬性 Refresh方法
所能得到的也只有MyBase

在不知道原始碼的狀態下
要修改也只有兩種方法:
1.不用MyBase 整個重寫
2.保留MyBase 加上新的程式碼

這兩種方法 感覺上並沒有複寫[屬性][方法]的意義
(個人認為:修改原始碼才是有意義)

如果不用MyBase 整個重寫
那就直接設一個新的屬性或方法就好

如果保留MyBase 加上新的程式碼
那就直接呼叫Button屬性或方法 再加上新的程式碼就好了

例如我重寫Class1的Refresh方法

這樣乾脆直接呼叫Button類別的Refresh方法
然後再加上MessageBox.Show("OK")就好了
何必複寫Button類別的Refresh方法?

因此我的第二個問題是:
[再不知道原始碼的情況下 複寫.NET Framework類別的[屬性][方法]的意義為何?]

也就是說:
在不了解原始碼的情況下 複寫[屬性][方法]似乎是沒有意義?
因為就只能:
1.整個重寫=那就失去Refresh的意義
2.加上新的程式碼=那就呼叫方法 再加上新的程式碼就好


不知道前輩們能理解我所說的嗎?
謝謝~~

搜尋相關Tags的文章: [ 繼承 ] , [ .NET Framework ] , [ 複寫 ] , [ 屬性 ] , [ 方法 ] ,
本篇文章發表於2018-12-17 13:33
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
作者回應

city
檢舉此回應
針對1樓 繼承.Net FrameWork類別 並修改[屬性][方法] 補充一下

假設今天我自訂了一個類別 類別名稱為:MyButton
類別內有一個自訂方法:
Public Overridable Sub ButtonTextToFile(ByVal filePath As String, ByVal c As Control.ControlCollection)

假設今天我開放這個類別讓各位繼承
各位看到ButtonTextToFile方法 也不知道這個方法是在幹嘛的 只能大約"猜"一下 "好像"跟Button文字有關 "好像"跟檔案有關

如果各位用Class1來繼承MyButton
並複寫ButtonTextToFile方法 會得到:



也就是各位會得到一個 MyBase.ButtonTextToFile(filePath, c)
可是各位還是不知道該如何修改ButtonTextToFile的內容

=======================================================================================================
如果我今天開放了MyButton類別的程式碼 如下:



各位就可以清楚ButtonTextToFile方法內在做什麼
這時候各位就可以修改ButtonTextToFile方法的內容
例如:將Button文字用Unicode編碼寫入檔案

=======================================================================================================
個人是覺得 .Net Framework類別要開放程式碼 這樣使用者才能夠修改內容
這樣才有複寫的意義

也就是說:
如果我不開放MyButton類別的程式碼 卻又讓各位可以繼承MyButton類別
就算各位繼承MyButton類別 得到一個MyBase方法 又能幹嘛呢?

不知道我的說法是否有錯誤?

還是說 各位前輩們複寫.Net Framework類別的[屬性][方法]
得到一個MyBase屬性 MyBase方法
都拿來做什麼用途呢?

謝謝~~
本篇文章回覆於2018-12-18 12:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
如果[別人的原始碼]可以隨你改,

那麼, 我把你的原始碼改了, 你把我的原始碼改了...

你覺得系統還能運作嗎??

=====================
你今天加了一個 MessageBox.Show("OK")
明天他加了一個 MessageBox.Show("ERROR")
後天我覺得這2行太礙眼, 改成MessageBox.Show("小羊到此一遊, OK, ERROR")


你覺得系統操作者看到彈出訊息會做何感想?
本篇文章回覆於2018-12-19 01:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
複寫(繼承之後, 進行複寫)

就是為了讓每個程式設計師去定義自己專屬的物件
(不必重新造輪子, 只需要繼承現有的輪子, 再稍微改一下, 加入自己的特色)

=================================

再者, 每個class
(不管是微軟的, Java的....還是php...都有document可以查,
原始碼只是有助於了解其內部運作原理, 實際在繼承時本來就是要原本class的特性來走,
看不貫現有的輪子, 請自己造輪子)
本篇文章回覆於2018-12-19 01:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

city
檢舉此回應
To:小羊窒息

以下內容若有錯誤請指正

微軟提供了繼承 覆寫 遮蔽 來編輯類別
當類別的作者 將[屬性][方法]設為Public公開時
別人修改公開的[屬性][方法] 似乎是一件合法的事?

開放程式碼跟資安似乎是有點關係
不過還是有許多作業系統業者願意開放程式碼
例如:Linux
微軟似乎也開始開放程式碼了
開放程式碼似乎變成一種趨勢...

若要自己做輪子
至少微軟也要告訴我們該怎麼做輪子
.NET Framework裡面數以千萬的介面 類別
使用者又如何能了解:該如何繼承類別 並修改其中的[屬性][方法]
或是如何實作這些介面

例如:
Button類別的FindForm方法
如果自己寫 該如何找出Button所在之處的Form

微軟似乎有開放.NET Framework部分的程式碼
不過好像是C#版本 好像沒看到VB.NET版本...

==========================================================================
想問小羊前輩:

1.大大是否會這麼做:繼承.NET Framework類別並修改裡面的[屬性][方法]?

2..NET Framework類別裡的[屬性][方法] 大大都有辦法覆寫? (就算是不知道原始程式碼)

3.覆寫.NET Framework類別裡的[屬性][方法] 這樣算是常態嗎? (程式業界常用的手法)

謝謝~~
本篇文章回覆於2018-12-20 12:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
1. 當然會 (我繼承Button之後要怎麼改寫都是依我自己的需求),
對於其他人來說, Button是不變的,
其他人可以自己繼承Button 來寫出自己專屬的Button(彼此不會干擾)

然而, Button本身是不可能允許修改的,
公開原始碼的目的也不是要讓你自行去改寫的,
而是讓你可以向原開發者(微軟, Java, Linux....)提出修改建議, 讓原開發者進行改版...


2. 不知道原始碼也可以覆寫, 重點是要知道有哪些function (找官方的 Document 文件來研究)


3. 覆寫是常態...
本篇文章回覆於2018-12-20 12:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
不錯的參考

誰是誰
檢舉此回應
"微軟似乎有開放.NET Framework部分的程式碼
不過好像是C#版本 好像沒看到VB.NET版本..."

當然是 C# 版本,因為 .NET Framework 大部分的程式碼都是用 C# 寫的。

本篇文章回覆於2018-12-20 13:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

誰是誰
檢舉此回應
微軟在很多地方都有告訴你怎麼做輪子,只是你不夠用功而已。
本篇文章回覆於2018-12-20 13:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

city
檢舉此回應
大概了解了

感謝兩位前輩的說明 :)
本篇文章回覆於2018-12-20 22:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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