面向对象——抽象类与抽象方法

简介: 面向对象——抽象类与抽象方法

如果一个类不与具体的食物相联系,而只表达一种抽象的概念,仅是作为其派生类的一个基类,这样的类就是派生类,在抽象类中,声明抽象类中声明抽象方法是,如果加上abstract关键字则为抽象方法。abstract 修饰符可用于类、方法、属性、索引器和事件。


在类声明中使用abstract 修饰符以指示某个类只能是其他类的基类。


标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。


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


public abstract class A


{

   // Class members here.


}


抽象类的用途是提供多个派生类可共享的基类的公共定义。


抽象类具有以下特性:


抽象类不能实例化。

抽象类可以包含抽象方法和抽象访问器。

不能用sealed修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用sealed 修饰符的类无法继承,而abstract 修饰符要求对类进行继承。

从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。

抽象类必须为所有接口成员提供实现。


实现接口的抽象类可以将接口方法映射到抽象方法上。例如:


interface I


{void M();}


abstract class C : I


{

public abstract void M();


}


抽象方法是隐式的虚方法。


由重写方法override提供实现,此重写方法是非抽象类的一个成员。


只允许在抽象类中使用抽象方法声明。


在抽象方法声明中使用 static 或 virtual 修饰符是错误的。


当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。例如:


public class D


{

public virtual void DoWork(inti)      {   // Original implementation.    }


}


public abstract class E : D


{ public abstract override void DoWork(inti);}


public class F : E  


{

public override void DoWork(inti)  


{  // New implementation.  }


}


如果将 virtual 方法声明为 abstract,则该方法对于从抽象类继承的所有类而言仍然是虚方法。


继承抽象方法的类不能访问该方法的原始实现。


在上例中,类F 的DoWork不能调用类D中的DoWork。通过这种方式,抽象类可以强制派生类为虚方法提供新的方法实现。除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用 abstract 修饰符是错误的。


在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。


例:自定义抽象类计算圆形面积


public partial class Form1 : Form


   {

public Form1()


{InitializeComponent();}


private void button1_Click(object sender, EventArgs e)


       {

CalcAreacalcArea = new CalcArea();//实例化派生类


           Roll roll = calcArea;//使用派生类对象实例化抽象类


           string strNum=textBox1.Text.Trim();//记录TextBox文本框中的内容


if (strNum != "")//判断是否输入了圆半径


           {

try


               {

roll.R = int.Parse(strNum );//使用抽象类对象访问抽象类中的半径属性


                   textBox2.Text = roll.Area().ToString();//调用自定义方法进行求圆面积


               }


catch


               {

MessageBox.Show("请输入正确的圆半径!");


               }


           }


       }


   }


public abstract class Roll


   {  // 圆半径


privateint r = 0;


publicint R


{ get {return r;}set{r = value;}  }


public abstract double Area();// 抽象方法,用来计算圆面积


   }


   public class CalcArea : Roll//继承抽象类


   {

public override double Area()   // 重写抽象类中计算圆面积的方法


       {

returnMath.PI * R * R;


       }


}



虚拟方法和抽象方法有什么区别?

抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现,

虚拟方法有实现代码,抽象方法则没有,

并且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类

抽象方法是虚拟方法的一种

抽象方法没有实现,它的存在只是为派生类统一接口;派生类应该实现这个方法

如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为

抽象方法。

抽象方法只存在于抽象类中,有抽象方法的类必须定义为抽象类

其实大家首先要搞清楚,虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象类中可以包含抽象方法与一般的方法,抽象类不可以new,抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。它们两个相像的一点是都用override重写


目录
相关文章
|
1月前
|
C++
C++程序中的抽象类
C++程序中的抽象类
26 0
|
1月前
抽象类
如何使用如何使用抽象类和抽象方法: 1.不能直接创建new抽象类对象。 2.必须用一个子类来继承抽象父类 3.子类必须覆盖重写抽象父类当中所有的抽象方法 4.创建子类对象进行使用 关于抽象类: 1.抽象类不能创建对象,只能创建器非抽象的子类对象 2.抽象类中,可以有构造方法,是子类创建对象时,初始化父类成员用的。 3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类 4.抽象类的子类,必须重新抽象父类中的所有抽象方法和抽象方法: 1.不能直接创建new抽象类对象。 2.必须用一个子类来继承抽象父类 3.子类必须覆盖重写抽象父类当中所有的抽象方法
20 0
|
1月前
|
C++
C++面向对象编程中的 纯虚函数 与 抽象类
C++面向对象编程中的 纯虚函数 与 抽象类
|
1月前
3.抽象类
如何使用如何使用抽象类和抽象方法: 1.不能直接创建new抽象类对象。 2.必须用一个子类来继承抽象父类 3.子类必须覆盖重写抽象父类当中所有的抽象方法 4.创建子类对象进行使用 关于抽象类: 1.抽象类不能创建对象,只能创建器非抽象的子类对象 2.抽象类中,可以有构造方法,是子类创建对象时,初始化父类成员用的。 3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类 4.抽象类的子类,必须重新抽象父类中的所有抽象方法和抽象方法: 1.不能直接创建new抽象类对象。 2.必须用一个子类来继承抽象父类 3.子类必须覆盖重写抽象父类当中所有的抽象方法
18 0
|
10月前
|
Java 编译器
认识抽象类
认识抽象类
55 0
|
缓存 Java 应用服务中间件
一文带你使用xxl-job定时任务
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。 因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
1678 0
一文带你使用xxl-job定时任务
|
10月前
|
消息中间件 Java Kafka
Hyperledger Fabric 通道配置文件和容器环境变量详解
Fabric 节点的主配置路径为 FABRIC_CFG_PATH 环境变量所指向路径(默认为 /etc/hyperledger/fabric)。在不显式指定配置路径时,会尝试从主配置路径下查找相关的配置文件。
264 0
|
10月前
|
弹性计算 固态存储 数据可视化
2023阿里云服务器租用价格表(一年/按月/按小时报价明细)
阿里云服务器分为云服务器ECS和轻量应用服务器,云服务器ECS专业级云服务器常见的ECS实例规格有ECS共享型n4、ECS突发性能型t6、ECS共享型s6、ECS计算型c5、ECS通用型g5、ECS内存型r5、通用型g7、计算型c7、大数据型d1、GPU云服务器、本地SSD型、高主频通用型hfg7、FPGA计算型 f3及弹性裸金属服务器等。阿里云轻量应用服务器优惠活动来了,2核2G3M带宽轻量服务器一年108元,2核4G4M带宽轻量服务器一年297.98元12个月。
474 0
|
传感器 机器学习/深度学习 编解码
领域最全!多传感器融合方法综述!(Camera/Lidar/Radar等多源异构数据)(下)
自动驾驶正成为影响未来行业的关键技术,传感器是自动驾驶系统中感知外部世界的关键,其协作性能直接决定自动驾驶车辆的安全性。本文主要讨论了近年来自动驾驶中多传感器融合的不同策略。分析了常规传感器的性能和多传感器融合的必要性,包括radar、激光雷达、摄像机、超声波、GPS、IMU和V2X。
领域最全!多传感器融合方法综述!(Camera/Lidar/Radar等多源异构数据)(下)