专注于自动化测试,性能测试.......

C#的抽象类和方法,重载,覆盖,隐藏

上一篇 / 下一篇  2008-03-06 16:38:07 / 个人分类:C# Programming

51Testing软件测试网.yuV)O&D

第四例 C#的抽象类和方法,重载,覆盖,隐藏51Testing软件测试网t/E.h-d n$D9k6N

51Testing软件测试网|5U|*R0s } F([b

 51Testing软件测试网o2w5z6y TH

"`rW6N7b l'Jq0hO0using System;

b `1mF9T051Testing软件测试网|3cX"pY"UW

namespace testClassApp51Testing软件测试网3Q)n"\tx JfZ*V Y
{51Testing软件测试网7]!W9fqR&Lr1\sd
   /// <summary>51Testing软件测试网rp#{|P;u |l
   /// Class1 的摘要说明。51Testing软件测试网? Op3@ gK ^
   /// </summary>51Testing软件测试网8yX3H.ARhm
   class Class151Testing软件测试网ED$An5T H
   {
$bGt t_9F"j2Y0       /// <summary>51Testing软件测试网H/i;N Uo9n
       /// 应用程序的主入口点。
5{.e(YE.kHE_'~0       /// </summary>
a RIsr_0F0       [STAThread]
%_0_:u s!B6S.Ov8e0       static void Main(string[] args)
MtQt*?si8n5f}E0       {
xx@[[D0          //
#r\bo1l i` [z0          // TODO: 在此处添加代码以启动应用程序51Testing软件测试网'NzF3\J(h$B
          //
51Testing软件测试网:c6qP~X$^

w1qF?^7}-KX0          double len = 2.5;
7lu+a7I!m v+G&EL!q0          double wid = 3.0;51Testing软件测试网/LW2h J0mJ3eN5_
          double rad = 4.1;
'i;K#x6__ T1QD0          Rectangle aRect = new Rectangle();51Testing软件测试网:]|7|hRt#wp
          aRect.length = len;51Testing软件测试网'pY]+C eD
          aRect.width = wid;51Testing软件测试网$cc/B%IpV^Y
          Circle aCirc = new Circle (rad);
"fP-|({+]:^(o3C-e0          Console.WriteLine ("Area of Rect is:{0}",aRect.Area ());51Testing软件测试网.uctJ3Nfr+nJ
          Console.WriteLine ("Area of Circ is:{0}",aCirc.Area ());51Testing软件测试网8lp[3CI:@dn9^9W
       }51Testing软件测试网jnUjC
   }

#kH/R3g?hXUGv"D051Testing软件测试网7M1V(ZvE8p.X QZ ^X

   abstract class Shape             //抽象基类,不可实例化51Testing软件测试网(W,d7i5[a!GH'M
   
/* 1)声明一个抽象类使用abstract关键字51Testing软件测试网 ][Z ?1DU"B&xR[
     * 2)只要包含抽象方法的类就是抽象类(哪怕只有一个),当一个抽象类中所有的方法都是抽象时,我们就可以定义成接口
w)N;{[Rj6x0     * 一个类可以包含一个或多个抽象方法51Testing软件测试网|{CFBf&mN!B
     * 3)抽象类中可以存在非抽象的方法(方法可以有具体的实现)51Testing软件测试网}H(NEO;h@/DP jC
     * 4)抽象类不能被实例化51Testing软件测试网ij-R$SmB{:@
     * 5)实现抽象类用":",实现抽象方法用override关键字
} So VE\3} j8g0     * 6)抽象类可以被抽象类所继承,结果仍是抽象类
6q`"BO8a4z7S0     * 7)抽象方法被实现后,不能更改修饰符
7c];h2][j Wku0    */
,N6}CR#b1nI-e~0
    {51Testing软件测试网O8?4g+U:UwT
       public const double pi=3.14;  //常量51Testing软件测试网7`+S4D.Q Uni
       protected double x, y;        //私有,可继承变量
P%[o3a'wo#a0k\7o0       
//构造函数
hij&|.||l7E1b0        /*
bHJLT~.S0         1)对象最初对对象进行实例化的过程叫做构造阶段,这个过程就是由构造函数完成的,构造函数就是用于初始化数据的函数。
V\gmN-N0         2)所有的对象(类)都有一个默认的构造函数,没有参数,与类同名,但一个类可以包含几个带参数的构造函数
0[$xj(U1p'J0        称为非默认的构造函数。51Testing软件测试网 [Xj^p.s
         3)构造函数用new关键字来调用,例如:51Testing软件测试网WpghL*x c
         * 调用默认构造函数:类名类的实例名= new 类名();
a4b&LPBsEtC$R8Q2tz0         * 调用非默认构造函数:类名类的实例名= new 类名(参数);
D'\4l"`5_A/i5q0         * 4)构造函数与字段,属性,方法一样,可以使公共或者私有的51Testing软件测试网)X'bAoI-I
         * 5)构造函数只是在对象被建立时调用,就是一句代码也不写或没有实现构造函数,那么这个类也会建立,51Testing软件测试网^Z(Vv!vW#Gxs
         * 这个函数只是说在对象在建立的时候给了一个给这个对象初始设置值的机会
Yc f+U9B/{0         */
y/P-`7Sc|9Q0
        public Shape()               //默认构造函数
C.n X^k/x0       {
{q1y|,u5o p q2[*A0          x=y=0;51Testing软件测试网:A%hw?+~i:xh `
       }51Testing软件测试网#E V8D8g'S;a L
       public Shape(double x,double y)  //带参数构造函数51Testing软件测试网,@ ^6y3J;s"U
       {
5UH.\9sZ"UAYy0          this.x = x;
ar.`lDb;L)AdT-S0          this.y = y;51Testing软件测试网 Y i"A D3\f G
       }51Testing软件测试网jR Ex*@
       public abstract double Area();   //抽象方法,需重载
,r,nm~'G.F\ a0H2l d0
        /*51Testing软件测试网1jw:k ds3q
         * 1)声明一个抽象方法使用abstract关键字,抽象方法只包含方法定义,但没有具体实现的方法,需要其子类或者子类的子类来具体实现51Testing软件测试网{o+eT ?-|2c
         * 2)子类继承抽象父类后,可以使用override关键字覆盖父类中的抽象方法,并做具体的实现。也可以不实现抽象方法,留给后代实现,51Testing软件测试网],[Q Q?%C3l*Nd1^
         * 这时子类仍旧是一个抽象类,必须声明为abstract51Testing软件测试网#d7}zd|.oh-au fY
         * 3)继承的抽象方法不可以被隐藏
Ef6^9~0cq?0         */
51Testing软件测试网(Ew$mfu4Kk
    }51Testing软件测试网A'gI#];o

51Testing软件测试网G+I b'Yv6{~ {!{

   class Rectangle: Shape51Testing软件测试网-C?sGm"qfN
   {51Testing软件测试网8S`9w/?#a
       public Rectangle():base(){}
a&y?a$@T,e9e X0       public Rectangle(double x, double y): base(x,y){}//使用基类构造函数51Testing软件测试网 DgSA&|uVcu
       
/*
ao4j7a]#Bn.fl{0         1) 隐式调用基类构造函数:如果没有明确指明base()( 即不使用base() ),子类会自动调用基类的默认构造器51Testing软件测试网;_(^9l*YQ)l T o9s
         2) 显示调用:上面的就是显示调用,使用base(参数)
0ClQ'b#Dc {R0         */
lI hg)z5nj1k/Yo0        public override double Area()   //函数覆盖,子类继承抽象父类后,可以使用override关键字覆盖父类中的抽象方法,并做具体的实现。51Testing软件测试网 LE2fM}
            //也可以不实现抽象方法,留给后代实现,51Testing软件测试网&qbE&h^^2nZ
       {51Testing软件测试网!qB+|6N0^
          return (x*y);51Testing软件测试网 J8M'd-T/_,f:MSwV
       }
A5n(qH`v/B W0       public double length   //属性:矩形长度
Fr,Wr8r:H0       {
*j`)|k$e0          get51Testing软件测试网zs~ Q-Y&G^gZ-B
          {
4YQ/R;pj5b"~.i C m0             return x;51Testing软件测试网.a/PI1?2?*` B
          }
Z~k+ox(Z0          set51Testing软件测试网.?iC#i j
          {
m clD$h+M0             if (value>0){x = value;}
$gdt~$zd r+?0          }
#N2@3?0u!H!z%_J0       }51Testing软件测试网R6g%R#hK,SFp#B*sURt
       public double width    //属性:矩形宽度
&{`k u.E.S0       {
AQ'OS(}5h$J;P7w0          get51Testing软件测试网?"?W0w;x#KR
          {
vM}%q%W vac0             return y;51Testing软件测试网!?AK8f`cFa$n
          }
{v]O1G\+[ztV \{0          set
T+~-uH5iNy.}0          {51Testing软件测试网f8rs a(LIB5H/Q m
             if (value>0){y = value;}51Testing软件测试网)VF0X/d&I{ y
          }51Testing软件测试网pZNVvm6ezso
       }
51Testing软件测试网 z5E4V;EE

6I`o4m*p v0   }51Testing软件测试网ra&sXCH8xs

51Testing软件测试网 d`.fu(N2H{4T

   class Ellipse: Shape
,Yui rS(`TH&aM9`0   {
FNGs$W0       public Ellipse(double x, double y):base(x,y){}//使用基类Shape的构造函数
v9A0D*j&a2Up!sF~0       public override double Area() //函数覆盖
8r.{8a;g WC-X[\%i \0       {51Testing软件测试网;?.K]&ZNJr
          return pi*x*y;51Testing软件测试网 hUDVL+~&b6L
       }
*?\-[\;Jm0   }51Testing软件测试网;D,E&\c9QL
   class Circle: Ellipse
"f'[Mq6_0   {
R,cpkJ0       public Circle(double r):base(r,0){}  //使用基类Ellipse的构造函数51Testing软件测试网N@D/C0q;L X L,L
       public override double Area() //函数覆盖51Testing软件测试网}3x(vyMc:q O _"T
       {51Testing软件测试网?yZh;ws2?_
          return pi*x*x;51Testing软件测试网#q {+m7@mC
       }51Testing软件测试网#oCM q!Ks!v)i#O zH
   }51Testing软件测试网~P#r`:@7c+\-J
       
   //隐藏:在子类中创建与父类中的方法具有相同签名(相同的方法名,相同的参数列表-参数类型和次序)的方法(可以带有"virtual"或"override"关键字)即可实现,但建议使用"new"关键字,以明确地隐藏。51Testing软件测试网l7Na/CP&N8r
          //只能使用"override"关键字来覆盖(override)父类中标记为"virtual"、"abstract"或"override"的方法,而子类中标记为override的方法,也必须是父类中标记为"virtual"、"abstract"或"override"的方法。51Testing软件测试网3^O&D(Y6R_3w
          //覆盖(override):必须使用override关键字,可以被覆盖的方法包括标记为abstract,virtual,和override的方法;51Testing软件测试网-H{S,s R/KhC?j `g
          //隐藏:使用new关键字,也可不使用关键字,可以被隐藏的方法包括一般方法,和标记为virtual"或"override"的方法;
D]s&J*?$G@R0          //重载(overload):不需要任何特殊的关键字
4UUD!UH3[9eH0          //静态方法可以被隐藏或重载
w sO?m2J;O(`+G0    /*重载,覆盖,隐藏之间的区别51Testing软件测试网iO(~t`S$?u,o
     重载(overload)用于同一类中的成员函数,其特征为:
_gd5u6^0     * 1)在同一类中51Testing软件测试网k"W/?!o*c'w7E
     * 2)相同的函数名51Testing软件测试网.Ke;J*\r*dr]
     * 3)参数不同(包括参数类型不同,或参数个数不同,或两者都不同,注意:和返回值没关系)51Testing软件测试网uQ+p"FYF
     * 4)和是否虚函数无关
g0C6bakCd0     覆盖(override)是指派生类函数覆盖基类函数,其特征为:
0]fCBDM4B!t)n0     * 1)不同的范围(分别位于派生类与基类)51Testing软件测试网:lA!@&I4q5\ ?
     * 2)相同的函数名称
'F R^cZ R)s-yv.tL/@0     * 3)参数相同
;t&U-oxAe0     * 4)基类函数必须是虚函数
]6P3@i)iBBS0s0     隐藏(hide)是指派生类的函数屏蔽了与其同名的基类函数,其特征为:
pP&k {(k Y{sVtm0     * 1)不同的范围(分别位于派生类与基类)
sWe3cL0h[ I Kh0     * 2)相同的函数名51Testing软件测试网$Ij6h}9M _bi2Aw}
     (3)若参数不同,基类函数无virtual关键字,基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载);
&pDu [L-E cwRX0    ()若参数不同,基类函数有virtual关键字。基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载;因为参数不同,所以是隐藏而不是覆盖);
;jOE UoRi0    ()若参数相同,基类函数无virtual关键字。基类函数将会被隐藏。(因为基类函数不是虚函数,所以是隐藏而不是覆盖)。51Testing软件测试网7GoZQ3S\\
    ()若参数相同,基类函数有virtual关键字。如果基类函数有多个重载版本,且派生类并没有重写所有的同名虚函数,当在派生类中调用函数时,基类中未被重写的虚函数将被隐藏。(当然,被重写的函数就是覆盖了)。51Testing软件测试网|Rf+v(E-t
注意: 如果想在派生类中调用基类中的被隐藏的函数,可以在派生类中填写如下代码:using Base::Fun251Testing软件测试网5A.R*@;x L:T
     */
51Testing软件测试网.w0v%P,t&G0}$G

51Testing软件测试网pA!S)Z\'b8ql:b.O%o


1x/s\~C"dsc9mh0}51Testing软件测试网NTw7Y9w [ry

%xq0x;f!UsB%xD0

TAG: 编程学习

 

评分:0

我来说两句

wxf_xsfy

wxf_xsfy

自动化测试的拥簇者,善于自动化测试的框架和工具开发,TIB工作室核心成员

日历

« 2024-04-16  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 381280
  • 日志数: 79
  • 图片数: 1
  • 文件数: 1
  • 书签数: 3
  • 建立时间: 2007-09-19
  • 更新时间: 2018-01-30

RSS订阅

Open Toolbar