這個例項是子類的,但是因為你宣告時是用父類宣告的,所以你用正常的辦法訪問不到子類自己的成員,只能訪問到從父類繼承來的成員。
在子類中用override重寫父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是子類中重寫的方法;
如果子類中用new覆蓋父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是父類中的虛方法;
///
/// 父類
///
public
class parentclass
} ///
/// 子類1
///
public
class childclass1 : parentclass
} ///
/// 子類2
///
public
class childclass2 : parentclass
public
void
test()
}
執行呼叫:
parentclass par = new childclass1();
par.parvirmethod(); //結果:「子類1的方法」,呼叫子類的方法,實現了多型
par = new childclass2();
par.parvirmethod();//結果:「父類的方法」,呼叫父類的方法,沒有實現多型
深究其原因,為何兩者不同,是因為原理不同:
override是重寫,即將基類的方法在派生類裡直接抹去重新寫,故而呼叫的方法就是子類方法;而new只是將基類的方法在派生類裡隱藏起來,故而呼叫的仍舊是基類方法。
有這樣的需要的,比如people類有乙個run方法,man和woman這兩個類都是繼承自people的類,並且都重寫(override)了run這個方法(男人女人跑起步來不一樣).
現在有一群人一起跑步,有男人有女人.
我們可以把這些都裝進乙個people陣列(假設為peoples).
然後
foreach(people p in peoples)//peoples中物件不同(即有男有女),用於例項化的子類就不同。
由於多型性,在呼叫p.run()的時候p物件本身如果是男人就會自動呼叫男人的run方法,是女人就會呼叫女人的run方法。
依賴倒置原則,dip,dependency inverse principle dip的表述是:
1、高層模組不應該依賴於低層模組,二者都應該依賴於抽象。 2、抽象不應該依賴於細節,細節應該依賴於抽象。 這裡說的「依賴」是使用的意思,如果你呼叫了乙個類的乙個方法,就是依賴這個類,如果你直接呼叫這個類的方法,就是依賴細節,細節就是具體的類,但如果你呼叫的是它父類或者介面的方法,就是依賴抽象, 所以dip說白了就是不要直接使用具體的子類,而是用它的父類的引用去呼叫子類的方法,這樣就是依賴於抽象,不依賴具體。
其實簡單的說,dip的好處就是解除耦合,用了dip之後,呼叫者就不知道被呼叫的**是什麼,因為呼叫者拿到的是父類的引用,它不知道具體指向哪個子類的例項,更不知道要呼叫的方法具體是什麼,所以,被呼叫**被偷偷換成另乙個子類之後,呼叫者不需要做任何修改, 這就是解耦了。
為什麼乙個類的物件可以做成員變數呢 ?
對於物件導向的語言來說,乙個類中能夠使用的資料型別包括任何在本語言中合法的型別。乙個物件它屬於引用型別資料例項,當然就可以出現在乙個類中作為這個類的成員使用了,可能這個物件不是這個類的特有 特徵,但是它們存在一些必然或者實際行為動作中產生的間接聯絡,乙個物件成為乙個類的成員也就順理成章,這樣符合實際...
C 為什麼可以在乙個類裡宣告並例項化自身類的物件
例子1 自身類的物件是靜態字段,該欄位屬於類,而不屬於該類的每個物件。using system namespace newselfclassobject n o atom.c.radius,atom.n.radius,atom.o.radius c 6 引入了字串字首 console.writeli...
乙個可以用滑鼠改變控制項位置和大小的類
using system using system.collections.generic using system.text using system.componentmodel using system.data using system.drawing using system.window...