abstract、virtual、override、new說明(ZT)

上一篇 / 下一篇  2010-05-12 13:40:48 / 个人分类:.NET

abstractITPUB个人空间s8vk!E%AO
abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。
p E(e6X){xP2\0ITPUB个人空间2L.j$n[*z
在类声明中使用 abstract 修饰符以指示类只能是其他类的基类。
3p5S ^5q/fG9PjB:]0
f%b3HB x(TU%O|i0抽象类具有以下特性:
$U5Cu\4J^XE9MT4T]T0·抽象类不能实例化。ITPUB个人空间F-M%J)J9el3M
·抽象类可以包含抽象方法和抽象访问器。
6a#D:O'mU3`j5RoX0·不能用 sealed 修饰符修改抽象类,这意味着该类不能被继承。ITPUB个人空间&o X XE}l(e K `(k
·从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
!i$d*zO n1Q0·在方法或属性声明中使用 abstract 修饰符以指示此方法或属性不包含实现。
0h8|7{9Q%zp3~&` M%x\/Bt0
1^(G {n t(q5j-V0抽象方法具有以下特性:ITPUB个人空间 xLZ J&g:_z
·抽象方法是隐式的 virtual 方法。ITPUB个人空间x%\0J]$Pu
·只允许在抽象类中使用抽象方法声明。
)u$r4~`}0]1a'}z2U5}0·因为抽象方法声明不提供实实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如: public abstract void MyMethod();
.kQRd~0e"v0·实现由 overriding 方法提供,它是非抽象类的成员。
9m(?"aU |%[{"HQ0·在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
n a.Jdy/F\4ZD0ITPUB个人空间(FAh/F_:{4`
除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。ITPUB个人空间U WYh L*@
·在静态属性上使用 abstract 修饰符是错误的。ITPUB个人空间"qx*X*l8W5VV GE
·在派生类中,通过包括使用 override 修饰符的属性声明可以重写抽象的继承属性。ITPUB个人空间Y xY^9f3t,cN

Uw)D$Y%nF0virtualITPUB个人空间(i/[C_Jp
virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。
6G+Zv.b)D k U$a&G+S$U7}Y S0ITPUB个人空间{o]0y5j"_
调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。ITPUB个人空间 `EJ:JvL"@

O1c4rJ {QA'X0默认情况下,方法是非虚拟的。不能重写非虚方法。ITPUB个人空间Rn| |r L \l

6T^J:e6j`1k.h5E"w'zY0不能将 virtual 修饰符与以下修饰符一起使用:
1~/E7Y2i/b y:}0static   abstract   overrideITPUB个人空间7T Q$D|:rs

] FJ1Tj:]0除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。ITPUB个人空间:a"L c)xD4_5wc
·在静态属性上使用 virtual 修饰符是错误的。ITPUB个人空间j Ao2ol)B8Z
·通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。
Mq { y~{ U.P0
#qJ$M)mw"Ut)t0override(覆盖上面两种关键字修饰方法)ITPUB个人空间#I o ^gW#s@^K
使用 override 修饰符来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。ITPUB个人空间LU&B7Ij;X.[

e$k(Z)g0J-ef~;ce0不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。ITPUB个人空间z L)u2_*soh.fO

j+JRW+d^K4m0重写声明不能更改虚方法的可访问性。重写方法和虚方法必须具有相同的访问级修饰符。ITPUB个人空间pJ?I u6K ae

'Psw[h-K0不能使用下列修饰符修改重写方法:ITPUB个人空间d(I4X(u;x'PsH
new   static    virtual   abstractITPUB个人空间*D$r2[\"{:y4lt
ITPUB个人空间OHJB DZ$l G.|H
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或重写的。 
lazB2g_p9B ke0
#i!e:_ \uVo0
using System; ITPUB个人空间E%@[ x5Sf~
 ITPUB个人空间9vs F8f!Cb!Y
namespace VitualMethod ITPUB个人空间 c*m'R(x Y8e!lP
ITPUB个人空间*f4XAUQ oT
    
class BeiseClass ITPUB个人空间 o'Ao!e"X.d
    { 
u)[?-Z d|b0        
public void RealMethod() ITPUB个人空间$j n`nW5`
        { ITPUB个人空间'KIp3X eF r V6Kv
            Console.WriteLine(
@"The ""RealMethod"" method of ""BeiseClass"" class!");  
7D'h*ksr%W0        } 
2X6i$wc-f4oz0 ITPUB个人空间;bwY4G4f*Z,Ns7jr1{4m
        
public virtual void ViutualMethod()  ITPUB个人空间'B4p @S G?S"c.{
        { ITPUB个人空间 O4YYBZ(Fg
            Console.WriteLine(
@"The ""ViutualMethod"" method of ""BeiseClass""class!");  ITPUB个人空间cpmI\5I
        } ITPUB个人空间j cr;m A)QGe#X
    } ITPUB个人空间RY0q6z AV L
 ITPUB个人空间U/D)qk$Gea
    
class NewAndOverride: BeiseClass 
p,VbT%pk0    { 
6h$s i+i.~u hqqFZ(m0        
/**//**//**//// <summary> 
@DJk6K5f5j1K!O6b0        
/// “new”用于隐藏基类成员的继承成员,是重写方法的另一种办法; ITPUB个人空间+YA3ZUF4o3d!O
        
/// 在同一成员上同时使用 new 和 override 是错误的; ITPUB个人空间 @0FD(UM&F
        
/// “override”只是隐藏了虚拟方法。 
%z&g7iuJ;liN0I0        
/// </summary> ITPUB个人空间N2Z&|$}`\.td9sQ
        new public void RealMethod()  ITPUB个人空间A%J7Z"D#@)}
        { ITPUB个人空间,Wt)y"E&tj
            Console.WriteLine(
@"The ""RealMethod"" method of ""NewAndOverride"" class!");  
0}&iP?f%E!ec,N8w0        } 
.b)\+tGB{!D)F&u0 ITPUB个人空间C v ?K8hk8Bc;?2r
        
public override void ViutualMethod()  ITPUB个人空间2dXa-[^"?$J@[ z
        { 
_a1Jw#w]0QyZ7Ta!Q0            Console.WriteLine(
@"The ""ViutualMethod"" method of ""NewAndOverride""class!");  
n|$ERV'AlC0        } 
i4e@ i3ilR0    } ITPUB个人空间.wke,sB!o!L |+r
 ITPUB个人空间2L+LHr*m,LR2cj%T
    
class Tester ITPUB个人空间+[y*JW+P
    { ITPUB个人空间 ]6|$tC^8B
        
/**//**//**//// <summary> ITPUB个人空间'r&DmVL#Ke?
        
/// 运行结果: 
X-{0d'xB0        
/// The "RealMethod" method of "BeiseClass" class! 
%kFQez]o0        
/// The "RealMethod" method of "NewAndOverride" class! 
Z[8Ob1Yiz;c0        
/// The "ViutualMethod" method of "BeiseClass"class! ITPUB个人空间3W~(SX,g Hl/?'M
        
/// The "ViutualMethod" method of "NewAndOverride"class! ITPUB个人空间P2v0t+_-C4x(_U ^2l:{
        
///  ITPUB个人空间L4L,k8CP#UU
        
/// The "RealMethod" method of "BeiseClass" class! ITPUB个人空间o4?i#h8M7W
        
/// The "ViutualMethod" method of "NewAndOverride"class! 
D M!N$UIN-K!y#T0        
/// </summary> 
;{.^"Bs1ItW-?0
        static void Main()  ITPUB个人空间I QC7Tq;V,s#Z
        { ITPUB个人空间 t!V*z;L~0K+}$m
            BeiseClass beiseClass 
= new BeiseClass(); 
c5l!W UM`0            NewAndOverride newAndOverride 
= new NewAndOverride(); ITPUB个人空间Q&Z(}y(G VJR~ FAE
         ITPUB个人空间~ A2j1q"v8eEST
            beiseClass.RealMethod(); ITPUB个人空间4F}.yQm's,H F d x
            newAndOverride.RealMethod(); 
{ut8R:P0         
hP jy|8AP5V w9l0 ITPUB个人空间Jo0f0P9If7R6o
            beiseClass.ViutualMethod(); ITPUB个人空间kBqm]w
            newAndOverride.ViutualMethod(); 
g;jv+At#h jz`0 
JB"a uz0            Console.WriteLine(); 
$FwW9^Y"A0 ITPUB个人空间3L]#c$g'g p3D$t#Z
            
// ITPUB个人空间o!UXl^l
            
// 注意:可以看到隐藏方法仍然存在,而被覆盖的方法已经不存在了; 
t S-f^Iu0            
// ITPUB个人空间g!G@ r+Hf)t I(YG
            beiseClass = newAndOverride; ITPUB个人空间f0fx-_xaB
             ITPUB个人空间pI4o,m*FWAxW
            beiseClass.RealMethod(); 
&?n*vV`*E0            beiseClass.ViutualMethod(); ITPUB个人空间-}gLkR1A'M
 
2Pu!c6zbxG6v0        } 
f B'@#uT0    } ITPUB个人空间l%J y7\|pH

*o:ca'OL_/Vt'm0newITPUB个人空间4da1F T#k t7~&d~
使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。ITPUB个人空间 K'CM;K S4Dq}s

r^;J[+rA:Th:Gu0类成员声明中可以使用与一个被继承的成员相同的名称或签名来声明一个成员。发生这种情况时,就称该派生类成员隐藏了基类成员。隐藏一个继承的成员不算是错误,但这确实会导致编译器发出警告。若要取消此警告,派生类成员的声明中可以包含一个 new 修饰符,表示派生成员是有意隐藏基成员的。 ITPUB个人空间GUS%J&juU
ITPUB个人空间 iA]R{
using System; 
\}8]G xH0 
wT4c,~I qq7S0
namespace TheNewKeyword 
t q!KRA Q&R0ITPUB个人空间/SU P1MAtB&a}
 
.Xl2`M H*S.id0    
class NewTestClassBase 
)?[{ h6M+n#@ WP0    { ITPUB个人空间 q*MRVX EY uc.C
        
public void PrintNewKeyword() 
!B LYq/y8}K_ l i0        { 
]+g7}pK,{0            Console.WriteLine(
@"This is base class!"); 
'dIXm(T0        } 
9@4K9r^VL}0    } 
GX6kC8y9Js$ku0 ITPUB个人空间#lCdrSt2L0\My0x
    
class NewTestClass : NewTestClassBase ITPUB个人空间!z,a/dh"e
    { 
Fg~`6e%`d]0        
/**//**//**//// <summary> 
u2Z7zJ W A0        
/// 如果这样写: 
`4gcR.w^H:Z0        
/// override public void PrintNewKeyword() 
;N7p8M om+GH&w8s0        
///  
kVz*nzu0        
/// 将产生编译错误: ITPUB个人空间+Z4e?|]!\@D
        
/// “TheNewKeyword.NewTestClass.PrintNewKeyword()” :  
Upe X#D"ac0        
/// 无法重写继承成员“TheNewKeyword.NewTestClassBase.PrintNewKeyword()”, 
n*Z;lge f)mk/[Y:s0        
/// 因为它未标记为 virtual、abstract 或 override。 ITPUB个人空间0\~;t@#B
        
/// </summary> ITPUB个人空间,bMO7i.TxT/h
        new public void PrintNewKeyword() ITPUB个人空间{@&mHr
        { ITPUB个人空间p6UT.{\ Ye
            Console.WriteLine(
@"This is ""new"" keyword!"); ITPUB个人空间yF6r,D)i^ `
        } 
a$?:B'm|'`:B r0    } ITPUB个人空间H Y0AtZ^!Rl*^
 ITPUB个人空间:v{ ia8l7OmLZ
     ITPUB个人空间%R-O2Fc)? E;C&d
    
/**//**//**//// <summary> 
C6B6iA-W;u0    
/// TheNewKeyword 测试“new”关键字。 ITPUB个人空间-k9B ~[m t5w@*r]*^7o
    
/// </summary> ITPUB个人空间!?D4kJ$XWD Q-U
    class TheNewKeyword ITPUB个人空间9cE;PE'P&{f
    { 
j+{8t&J'r0        
/**//**//**//// <summary> 
$V'k Hs/B }/v0        
/// 运行结果: ITPUB个人空间c4Rv-^%u2NV
        
/// This is base class! 
1I i Ubj!G6H:]8qv0        
/// This is "new" keyword!  ITPUB个人空间at V)y h#D E
        
/// </summary ITPUB个人空间d"L5b0}!Yl w
        static void Main() ITPUB个人空间3k.v@@y_
        { 
5tU0b$J6l T!A)M0            
// 
{-_0aY"X*xa,w0            
// TODO: 在此处添加代码以启动应用程序 ITPUB个人空间 |Z9m2fk?"|.d
            
// ITPUB个人空间!A:rpe NHo
            NewTestClassBase newTestClassBase = new NewTestClassBase(); ITPUB个人空间{`M5_V.P
            NewTestClass newTestClass 
= new NewTestClass(); 
/nR#dJ"O4XH$FQ0 
'oN(?c.P[n\/u0            newTestClassBase.PrintNewKeyword(); 
+? ]0ik7x0            newTestClass.PrintNewKeyword(); ITPUB个人空间Z\.V3M qK&q
        } 
K8K]C G'[:iK:ptf0    } ITPUB个人空间6YV L M1nu(A


TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-02-22  
    123
45678910
11121314151617
18192021222324
2526272829  

数据统计

  • 访问量: 8808
  • 日志数: 18
  • 文件数: 6
  • 建立时间: 2009-10-24
  • 更新时间: 2011-09-07

RSS订阅

Open Toolbar