Re: [問題]子類對象賦值給父類對象,父類對象能使ꔠ…
謝謝我文章幾位大大的回答,包括給定地址的文章我也看了。
這兩天看得比較多些的書,其實我覺得自己比較明白了,我認為其實是這樣的:
(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
02/12 22:46, 3F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):