一、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,可以正常執行,但會生成乙個警告如下,說明隱藏了乙個基...