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

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

如果一个类不与具体的食物相联系,而只表达一种抽象的概念,仅是作为其派生类的一个基类,这样的类就是派生类,在抽象类中,声明抽象类中声明抽象方法是,如果加上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重写


目录
相关文章
|
2月前
抽象类
作用:类似“模板”,其目的是要设计者依据它的格式来修改并创建新的类,但是并不能直接由抽象类创建对象,只能通过抽象类派生出新的类,再由它来创建对象,只能单继承 定义及使用规则: 1)包含一个抽象方法的类必须是抽象类 2)抽象类和抽象方法都要使用abstract关键字声明 3)抽象方法只需声明而不需要实现 4)抽象类必须被子继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法
22 0
|
8月前
|
C++
C++程序中的抽象类
C++程序中的抽象类
95 0
|
8月前
|
C++
C++面向对象编程中的 纯虚函数 与 抽象类
C++面向对象编程中的 纯虚函数 与 抽象类
C++学习笔记_04抽象类、多态 2021-04-15
C++学习笔记_04抽象类、多态 2021-04-15
|
Java 编译器
认识抽象类
认识抽象类
94 0
|
C++
C++多态纯虚函数和抽象类与多态案例(二)
纯虚函数和抽象类 在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容 因此可以将虚函数改为纯虚函数 纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ; 当类中有了纯虚函数,这个类也称为==抽象类== 抽象类特点: • 无法实例化对象 • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类
148 0
C++多态纯虚函数和抽象类与多态案例(二)
|
Java
java面向对象—抽象类、接口与多继承
有时候,我们可能想要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它能被实例化。例如:有一个父类“ 水果(Fruit)”,它有几个子类“苹果(Apple)”、“橘子(Orange)”、“香蕉(Banana)”等。水果在这里仅仅只是作为一个分类,显然水果的实例没有什么意义(就好像一个人如果告诉你他买了一些水果但是却不告诉你是苹果还是橘子,你很难想象他
1233 0

热门文章

最新文章

下一篇
开通oss服务