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

举报
AI浩 发表于 2021/12/23 00:09:49 2021/12/23
【摘要】 如果一个类不与具体的食物相联系,而只表达一种抽象的概念,仅是作为其派生类的一个基类,这样的类就是派生类,在抽象类中,声明抽象类中声明抽象方法是,如果加上abstract关键字则为抽象方法。abstract 修饰符可用于类、方法、属性、索引器和事件。 在类声明中使用abstract 修饰符以指示某个类只能是其他类的基类。 标记为抽象或...

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

 

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/105481595

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。