Re: [問題]子類對象賦值給父類對象,父類對象能使ꔠ…

看板C_Sharp作者 (賈富貴)時間15年前 (2011/02/12 21:26), 編輯推噓0(003)
留言3則, 1人參與, 最新討論串1/2 (看更多)
謝謝我文章幾位大大的回答,包括給定地址的文章我也看了。 這兩天看得比較多些的書,其實我覺得自己比較明白了,我認為其實是這樣的: (1)在c#中,實例其實并不確定是哪一個類的,當然你用new聲明為一個實例的時候, 這個實例就是你那個類的,但如果你用我舉例得那個方法,使用“=”的方式把這個實例 與另一個類(例如父類)聯系起來,連名稱也可重新聲明,則有時候又可以將這個實例 當作另一個類(例如父類)的實例來用,雖然這個實例的名稱變了,可使用的屬性和方 法也變了一些,例如子類特有的屬性、方法不能訪問了,但這個變了名稱的實例實際上 還是原來那個子類的實例,并沒有多出一個新實例,看起來有一個子類一個父類兩個實 例,實際上還是只有那一個。 (2)就我現在看的書,不知道這樣認為對不對:其實只有當用new聲明一個實例的時候 ,才是“創造”一個實例,上面我所說的方法,并沒有創造一個實例。就好像只有一輛 寶馬車x,當我造出(new)它來的時候,我是把它當作小汽車類的一輛汽車x,但我又可 以把它當作(=的方法)父類-交通工具的一個現成的交通工具,并可以把它叫做交通工 具y,不論是x、還是y,實際是一個東西,不是兩個。 ※ 引述《shishe (賈富貴)》之銘言: : 代碼如下: : using System; : using System.Collections.Generic; : using System.Linq; : using System.Text; : namespace Ch09Ex01 : { : public class MyBase : { : public int a = 4; : public virtual int fangfa() : { : return a; : } : } : public class MyClass : MyBase : { : public int b = 100; : public override int fangfa() : { : return a + b; : } : } : class Program : { : static void Main(string[] args) : { : MyClass shiyan1 = new MyClass(); : MyBase shiyan2 = shiyan1; : Console.WriteLine(shiyan2.fangfa()); : Console.ReadKey(); : } : } : } : 結果是顯示104,也就是說定義父類時所定義的虛擬方法在定義子類時被重寫,使該方法 : 使用到僅僅子類所有的成員。這樣當一個子類實例將自己賦給父類實例的時候,父類實 : 例的原虛擬方法將被替換,而且該方法將能使用子類的成員。 : 如上例所示,父類實例shiyan2根本沒有變量b,但他的方法fangfa()卻能調用變量b,是 : 不是這樣? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 221.5.86.3

02/12 22:45, , 1F
接下來可以看看"深入淺出-設計模式"這本書~會在裡面看到更
02/12 22:45, 1F

02/12 22:46, , 2F
具變化、更棒的應用,都是前人智慧的結晶,不過也要小心不
02/12 22:46, 2F

02/12 22:46, , 3F
要走火入魔就是了XD
02/12 22:46, 3F
文章代碼(AID): #1DLefhPO (C_Sharp)
文章代碼(AID): #1DLefhPO (C_Sharp)