為什麼乙個物件可以用父類宣告,卻用子類例項化

2021-08-19 05:50:38 字數 1628 閱讀 7085

這個例項是子類的,但是因為你宣告時是用父類宣告的,所以你用正常的辦法訪問不到子類自己的成員,只能訪問到從父類繼承來的成員。

在子類中用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...