Csharp/C#教程:深入解析C#中的abstract抽象类分享

抽象类和类成员
通过在类定义前面放置关键字abstract,可以将类声明为抽象类。例如:

publicabstractclassA { //Classmembershere. }

抽象类不能实例化。抽象类的用途是提供一个可供多个派生类共享的通用基类定义。例如,类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该库的程序员通过创建派生类来提供自己的类实现。
抽象类也可以定义抽象方法。方法是将关键字abstract添加到方法的返回类型的前面。例如:

publicabstractclassA { publicabstractvoidDoWork(inti); }

抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。抽象类的派生类必须实现所有抽象方法。当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。例如:

//compilewith:/target:library publicclassD { publicvirtualvoidDoWork(inti) { //Originalimplementation. } } publicabstractclassE:D { publicabstractoverridevoidDoWork(inti); } publicclassF:E { publicoverridevoidDoWork(inti) { //Newimplementation. } }

如果将virtual方法声明为abstract,则该方法对于从抽象类继承的所有类而言仍然是虚方法。继承一个抽象方法的类不能访问该方法的原始实现。在上一个示例中,类F中的DoWork不能调用类D中的DoWork。通过这种方式,抽象类可以强制派生类为虚方法提供新的方法实现。

定义抽象属性

下面的示例演示如何定义抽象属性。抽象属性声明不提供属性访问器的实现,它只声明该类支持属性,而将访问器实现留给派生类。下面的示例演示如何实现从基类继承的抽象属性。
此示例由三个文件组成,其中每个文件都单独编译,产生的程序集由下一次编译引用:

abstractshape.cs:包含抽象Area属性的Shape类。 shapes.cs:Shape类的子类。 shapetest.cs:测试程序,它显示某些Shape派生对象的面积。

若要编译该示例,请使用以下命令:

cscabstractshape.csshapes.csshapetest.cs

这样将生成可执行文件shapetest.exe。
该文件声明的Shape类包含double类型的Area属性。

//compilewith:csc/target:libraryabstractshape.cs publicabstractclassShape { privatestringname; publicShape(strings) { //callingthesetaccessoroftheIdproperty. Id=s; } publicstringId { get { returnname; } set { name=value; } } //Areaisaread-onlyproperty-onlyagetaccessorisneeded: publicabstractdoubleArea { get; } publicoverridestringToString() { returnId+"Area="+string.Format("{0:F2}",Area); } }

属性的修饰符就放置在属性声明中。例如:

publicabstractdoubleArea

声明抽象属性时(如本示例中的Area),指明哪些属性访问器可用即可,不要实现它们。在此示例中,只有一个get访问器可用,因此该属性是只读的。
下面的代码演示Shape的三个子类,并演示它们如何重写Area属性来提供自己的实现。

//compilewith:csc/target:library/reference:abstractshape.dllshapes.cs publicclassSquare:Shape { privateintside; publicSquare(intside,stringid) :base(id) { this.side=side; } publicoverridedoubleArea { get { //Giventheside,returntheareaofasquare: returnside*side; } } } publicclassCircle:Shape { privateintradius; publicCircle(intradius,stringid) :base(id) { this.radius=radius; } publicoverridedoubleArea { get { //Giventheradius,returntheareaofacircle: returnradius*radius*System.Math.PI; } } } publicclassRectangle:Shape { privateintwidth; privateintheight; publicRectangle(intwidth,intheight,stringid) :base(id) { this.width=width; this.height=height; } publicoverridedoubleArea { get { //Giventhewidthandheight,returntheareaofarectangle: returnwidth*height; } } }

下面的代码演示一个测试程序,它创建若干Shape派生对象,并输出它们的面积。

//compilewith:csc/reference:abstractshape.dll;shapes.dllshapetest.cs classTestClass { staticvoidMain() { Shape[]shapes= { newSquare(5,"Square#1"), newCircle(3,"Circle#1"), newRectangle(4,5,"Rectangle#1") }; System.Console.WriteLine("ShapesCollection"); foreach(Shapesinshapes) { System.Console.WriteLine(s); } } }

输出:

ShapesCollection Square#1Area=25.00 Circle#1Area=28.27 Rectangle#1Area=20.00 您可能感兴趣的文章:C#抽象类,抽象属性,抽象方法(实例讲解)基于C#的抽象类别详解C#中抽象类与接口的区别详解详解C#用new和override来实现抽象类的重写区别轻松学习C#的抽象类C#抽象类和接口的区别分析C#中实现抽象类里建立静态方法c#中抽象类和接口的详细介绍C#中抽象方法与虚拟方法的区别C#抽象类与抽象方法详解

标签: 抽象类 st rac bst 抽象 tr abstract ab act str

基于C语言实现学生成绩管理系统

C语言实现通讯管理系统设计

上述就是C#学习教程:深入解析C#中的abstract抽象类分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/906974.html

(0)
上一篇 2021年10月24日
下一篇 2021年10月24日

精彩推荐