作者shishe (賈富貴)
站內C_Sharp
標題[問題]子類對象賦值給父類對象,父類對象能使用僅子類所有的成員?
時間Wed Feb 2 07:10:06 2011
代碼如下:
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
1F:推 horngsh:你說的正是OO裡面的多型(同名異式-Polymorphism) 02/02 09:32
2F:→ andymai:這跟多型是不一樣的意思吧...多型是相同的方法卻設計不同 02/02 11:06
3F:→ andymai:的傳入參數~原po也寫錯了~Main裡面寫的子類實例是當成父類 02/02 11:09
4F:→ andymai:用~而不是將自己賦給父類"實例"~就像是老爸和小孩各有"掃 02/02 11:11
5F:→ andymai:地"的方法~老媽(Main)叫的是老爸(MyBase)~但是動作的實體 02/02 11:12
6F:→ andymai:卻是小孩(MyClass)~所以當然是用小孩的方法掃地~邊掃邊留 02/02 11:15
7F:→ andymai:垃圾(b)... 02/02 11:15
8F:推 horngsh:A大,多型有2種,1.靜態多型(即method overloading) 02/02 12:30
9F:推 horngsh:2. Dynamic Binding 原作即是用動態繫結 02/02 12:31
10F:推 horngsh:A大,原波是沒弄懂Value Type and Reference Type的差別 02/02 13:00
11F:→ andymai:Sorry~我還真不知道Dynamic Binding算多型~書看太少了Orz 02/02 18:13