c 專題 基類的重寫

2021-10-06 17:39:03 字數 4532 閱讀 9127

一、c#支援重寫例項方法和屬性,但是不支援重寫字段和任何靜態成員,為了進行重寫,需要將需要重寫的成員用virtual關鍵字標記。

如下:1)方法的重寫

class

father

}classme:

father

}class

son:

me}

呼叫如下:

father father =

newme()

; father.

myactor()

;呼叫的結果是:我是自己

所以我們可以看出當呼叫father類的虛方法時,呼叫的就是例項化的子類的物件方法。

2)屬性的重寫

class

myfather

else

}set

}}

class

mybrother

:myfather

}

classmy:

myfather

set}

}

二、如果我們宣告了虛方法,但是又不想重寫該方法,但是程式中又報了警告,那麼我們該怎麼辦?我們應該使用new關鍵字把父類的方法隱藏起來,等到真正呼叫的時候其實呼叫的還是父類宣告的虛方法,如下:

class

father

}classme:

father

}class

son:

me}

呼叫如下:

father father =

newson()

; father.

myactor()

;

呼叫結果如下:

我是父親
結果不是我們想象的他會呼叫son類中的方法,他會呼叫父類的方法,說白了new操作符不能實現重寫虛方法的功能,只能移除編譯器警告。

三、sealed修飾符

1)密封類中不能有virtual修飾的虛擬成員,否則會報錯

2)密封類禁止從該類派生

3)密封成員無法在派生類中被重寫

所以如果我們不想讓乙個類的成員被重寫,就將這個成員用sealed修飾符修飾就好。

四、base成員

1)base的作用乙個是在子類中呼叫父類的成員,如下:

classa}

classb:

a}classc:

b}classd:

c}

呼叫如下:

a a =

newd()

; a.

method()

;

呼叫結果:

我是c類
說明base只是呼叫當前子類的父類的成員,但是不會一直呼叫到最上層的基類的成員。

2)在基類有很多個建構函式的時候。

class

apublic

int age

//public a()

//publica(

string name)

publica(

string name,

int age)

public

virtual

void

method()

}classb:

apublic

override

void

method()

}classc:

bpublic

override

void

method()

}classd:

cpublic

override

void

method()

}

上面的**中,分為三種情況:

1)基類沒有建構函式,也就是有乙個隱藏的無參的建構函式

那麼子類不需要使用base來呼叫基類的建構函式;

2)基類有乙個無參的建構函式

子類不需要使用base來呼叫基類的建構函式;

3)基類乙個有參的建構函式

子類必須使用base來呼叫這個無參的建構函式;

4)基類有多個有參的建構函式

子類至少要使用base來呼叫基類的乙個建構函式,否則

5)基類有多個有參的建構函式,同時有乙個無參的建構函式

子類預設呼叫基類無參的建構函式。

五、抽象類

abstract

class

apublic

int age

//public a()

//publica(

string name)

publica(

string name,

int age)

public

virtual

void

virtualmethod()

public

abstract

void

method()

;}classb:

apublic

override

void

method()

public

override

void

virtualmethod()

}

如果我們就是想在父類中宣告一些虛的成員(抽象成員),至於具體的實現都是在子類中,我們就可以將父類宣告為抽象類(abstract修飾),然後在抽象類中宣告抽象成員,這些抽象成員使用abstract修飾就好,或者virtual,這裡說說一下virtual和abstract修飾的成員的區別:

1)virtual修飾的成員比如方法必須有實現,哪怕是只有一對大括號的空實現,但是abstract修飾的成員不允許有實現;

2)virtual修飾的成員可以被子類重寫,也可以不被重寫,程式不會報錯,但是abstract修飾的成員一定要在子類中實現;

3)抽象類中virtual修飾的已經在父類中實現地成員沒有意義,因為抽象類無法例項化。

六、所有的類都從object類派生,並且內建了諸如equals、tostring、memberwiseclone這些虛方法。

七、is操作符:

class

apublic

int age

//public a()

//publica(

string name)

publica(

string name,

int age)

public

virtual

void

virtualmethod()

}classb:

apublic

override

void

virtualmethod()

}

呼叫如下:

a a =

newa(""

);b b =

newb(""

);if(a is

object

)else

if(b is

object

)else

if(b is a)

else

if(a is b)

else

結果:

true

true

true

false

說明通過is操作符可以判斷子類物件是不是屬於父類,而且所有型別都是屬於object。

八、as操作符

a a =

newa(""

);b b =

newb(""

);a aa = b as a;

if(aa==

null

)else

b bb = a as b;

if(bb ==

null

)else

結果:

轉換成功

轉換失敗

上面**說明子類可以直接轉換為父類,但是父類不能直接轉換為子類。

as操作符實現型別的轉化,當轉換失敗的時候,就返回乙個null,避免了丟擲異常。

c 隱藏基類方法和重寫基類方法的區別

最近重新學習c 中基礎,找到了隱藏基類方法和重寫基類方法的一點區別,二者都是在派生類中定義了與基類中相同的方法,相同點派生類物件將執行各自的派生類中的方法,不同點,在向上轉型後,重寫基類方法的呼叫的是派生類的方法,而隱藏基類呼叫的是基類的方法,具體實驗 class program 如果乙個方法被子類...

c 隱藏基類方法和重寫基類方法的區別

最近重新學習c 中基礎,找到了隱藏基類方法和重寫基類方法的一點區別,二者都是在派生類中定義了與基類中相同的方法,相同點派生類物件將執行各自的派生類中的方法,不同點,在向上轉型後,重寫基類方法的呼叫的是派生類的方法,而隱藏基類呼叫的是基類的方法,具體實驗 class program 如果乙個方法被子類...

C 隱藏基類方法和重寫

本質上來說,是隱藏子類中基類的方法,但在子類中仍然可以訪問該功能。示例如下 namespace 隱藏基類和重寫 public class duck animal class program 執行結果為 值得注意的是,若在子類duck中不使用new,可以正常執行,但會生成乙個警告如下,說明隱藏了乙個基...