[問題] 方法可以接受類別型態的變數當參數嗎?

看板C_Sharp (C#)作者 (Terry)時間13年前 (2012/09/13 18:46), 編輯推噓0(0027)
留言27則, 3人參與, 最新討論串1/1
不好意思,我不太知道如何下這個標題.. 我從書上看到的一段程式是: public void PickLock(Locksmith lockpicker) { lockpicker.WriteDownCombination(safeCombination); } 這個方法傳入一個參數 Locksmith是一個類別 lockpicker是Locksmith的類別宣告變數 但是並沒有new,也就是沒有創造一個新物件 然後這個方法裡面,又用lockpicker去呼叫WriteDownCombination這個方法 但是不是應該要new一個物件出來,才能去呼叫WriteDownCombination這個方法嗎? 所以PickLock方法所傳入的參數,不是應該要是物件,而不能是宣告嗎? 謝謝幫忙 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.115.72

09/13 19:37, , 1F
如果那方法是static的話就不用new了...
09/13 19:37, 1F
可是我方法的前面也沒看到static... ※ 編輯: bernachom 來自: 114.42.115.72 (09/13 19:42)

09/13 22:44, , 2F
有可能是要透過某物件才能create說,換句話說
09/13 22:44, 2F

09/13 22:44, , 3F
這類別可能是某類別的附屬品哦
09/13 22:44, 3F

09/13 22:59, , 4F
還是補一下好了,理論上找不到ctor就代表該ctor非public
09/13 22:59, 4F

09/13 23:00, , 5F
或根本不需要實體,而要能得到實體大概有二種情況
09/13 23:00, 5F

09/13 23:01, , 6F
一個就像上面該大大一樣,找找看該類別有無可用的static
09/13 23:01, 6F

09/13 23:01, , 7F
因為該static成員因為是本身類別成員,所以看得到ctor
09/13 23:01, 7F

09/13 23:03, , 8F
另一種情況則是ctor為friend,使其他類別能看到ctor又在
09/13 23:03, 8F

09/13 23:04, , 9F
public域看不到 PS:像是引進組件時 不應該看到friend這樣
09/13 23:04, 9F

09/13 23:05, , 10F
應該就是這樣了@@~ 請多多指教
09/13 23:05, 10F
有點感覺了,我再把書翻看看,謝謝各位前輩的幫忙 ※ 編輯: bernachom 來自: 114.42.115.72 (09/13 23:18)

09/13 23:18, , 11F
那可以把Locksmith這個類別貼上來嗎?
09/13 23:18, 11F
好,我等一下打一下 ※ 編輯: bernachom 來自: 114.42.115.72 (09/13 23:19) [CODE] 我打部份相關的code出來 class Safe{ private Jewels contents = new Jewels(); private string safeCombination = "12345"; public Jewels Open(string combination) { if (combination == safeCombination) return contetns; else return null; } public void PickLock(Locksmith lockpicker){ //#1 lockpicker.WriteDownCombination(safeCombination); } } class Locksmith{ public void OpenSafe(Safe safe, Owner owner){ safe.PickLock(this); //#2 Jewels safeContents = safe.Open(writtenDownCombination); ReturnContents(safeContents, owner); } // other code . . . . } class Program{ static void Main(string[] args) { Owner owner = new Owner(); Safe safe = new Safe(); //other code Console.ReadKey(); } 好像就是前輩們說,Locksmith這個類別是safe這個instance的附屬品囉 @@? 謝謝幫忙 ※ 編輯: bernachom 來自: 114.42.115.72 (09/13 23:31)

09/14 01:03, , 12F
instance是拿來統一操作用的~就像主機板上有PCI-E顯示卡
09/14 01:03, 12F

09/14 01:04, , 13F
介面~所以不管哪家廠牌的PCI-E顯示卡都可以插上去用一樣
09/14 01:04, 13F

09/14 01:06, , 14F
看到這些程式並不能就這樣判斷沒有new過~因為safe.PickLoc
09/14 01:06, 14F

09/14 01:07, , 15F
k傳的是"this"~所以關鍵點在於Locksmith的OpenSafe在哪裡
09/14 01:07, 15F

09/14 01:08, , 16F
被呼叫了~也許在那邊就可以看到new的實體...
09/14 01:08, 16F

09/14 01:10, , 17F
另外Safe是class型態~說它是instance?應該不恰當吧???
09/14 01:10, 17F
最後的class Program裡面有寫這一段 Safe safe = new Safe(); 所以我就把safe當成是instance了@@.. 想請教一下 那個this傳的是物件的參考,是傳哪個物件的哪個參考呢? 我看得頭有點轉不過來.. 謝謝您的幫忙 ※ 編輯: bernachom 來自: 114.42.115.72 (09/14 01:32)

09/14 02:08, , 18F
"this"顧名思義就是"自己"~在Locksmith這個類別裡面用~當
09/14 02:08, 18F

09/14 02:09, , 19F
然指的就是"當下的自己"~所以肯定在某個地方有new過~不然
09/14 02:09, 19F

09/14 02:09, , 20F
沒有身體~又哪來的自己?
09/14 02:09, 20F
請教一下 所以這裡的this指的就是Locksmith 所 new出來的東西囉? 我在翻書看看,因為一直沒找到Locksmith所new出來的東西 ※ 編輯: bernachom 來自: 114.42.115.72 (09/14 02:29)

09/14 02:46, , 21F
嗯~建議是從呼叫OpenSafe的地方開始查...
09/14 02:46, 21F

09/14 16:03, , 22F
你貼的部分只有class定義,跟實際上有沒有new instance沒關
09/14 16:03, 22F

09/14 16:04, , 23F
如果OpenSafe有被用到,那個地方自然有某個Locksmith的物件
09/14 16:04, 23F

09/14 16:08, , 24F
someLS.OpenSafe(safe, owner); // someLS 就是那個物件
09/14 16:08, 24F

09/14 16:09, , 25F
方法定義的地方那樣寫就是定義會傳入物件了
09/14 16:09, 25F

09/14 16:09, , 26F
你先把語法弄熟一點吧...
09/14 16:09, 26F

09/14 19:05, , 27F
程式看看要不要貼在這: http://ideone.com/
09/14 19:05, 27F
文章代碼(AID): #1GKRc5a6 (C_Sharp)
文章代碼(AID): #1GKRc5a6 (C_Sharp)