当前位置:首页 > C#学习 > 正文内容

abstract抽象类和抽象方法

小道6年前 (2018-08-31)C#学习3062

abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的基类,不能实例化,而且abstract修饰的成员在派生类中必须全部实现,不允许部分实现,否则编译异常.在方法或属性声明中使用abstract修饰符以指示方法或属性不包含实现。

含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是不能被实例化,可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖。


抽象类拥有如下特征:

1,抽象类不能被实例化, 但可以有实例构造函数, 类是否可以实例化取决于是否拥有实例化的权限 (对于抽象类的权限是abstract, 禁止实例化), 

即使不提供构造函数, 编译器也会提供默认构造函数;

2,抽象类可以包含抽象方法和访问器;

3,抽象类不能使用sealed修饰, sealed意为不能被继承;

4,所有继承自抽象类的非抽象类必须实现所有的抽象成员,包括方法,属性,索引器,事件;


abstract修饰的方法有如下特征:

1,抽象方法即是虚拟方法(隐含);

2,抽象方法只能在抽象类中声明;

3,因为抽象方法只是声明, 不提供实现, 所以方法只以分号结束,没有方法体,即没有花括号{}部分;如

public abstract void 抽象方法();

4,override修饰的覆盖方法提供实现,且只能作为非抽象类的成员;

5,在抽象方法的声明上不能使用virtual或者是static修饰.即不能是静态的,又因为abstract已经是虚拟的,无需再用virtual强调. 


抽象属性尽管在行为上与抽象方法相似,但仍有有如下不同:

1,不能在静态属性上应用abstract修饰符;

2,抽象属性在非抽象的派生类中覆盖重写,使用override修饰符;


抽象类与接口:

1,抽象类必须提供所有接口成员的实现;

2,继承接口的抽象类可以将接口的成员映射位抽象方法.


抽象类不可以直接实例化,他可以有n个(n>=0)抽象方法,这些抽象方法子类必须实现.


实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace abstract抽象方法和类
{
    class Program
    {
        static void Main(string[] args)
        {
            //抽象类 cxl = new 抽象类(); //错误的,抽象类无法实例化。只能被继承
            普通类 p = new 普通类(); //实例化一个普通类。
            p.抽象方法(); //调用抽象类里面的抽象方法。
            p.普通方法(); //调用抽象类里面的普通方法。
            p.普通类内的普通方法();//调用普通类内的普通方法。
            p.name = "抽象类名字"; //子类“普通类”调用“父类”抽象类的字段。
            p.Age = 10;//调用属性
            Console.WriteLine("普通类可以继承抽象内的字段,属性..名字:{0},年龄:{1}",p.name, p.Age);//输出。
            Console.ReadKey();//按任意键结束。
        }
    }
    //定义一个抽象类,抽象类只能被继承,不能被实例化。
    //抽象类中可以包含抽象方法和普通方法。
    abstract class 抽象类
    {
        public string name;
        private int age;//抽象类内可以包含字段。
        public int Age //抽象类内可以包含属性。
        {
            get{return age;}
            set{age = value;}
        }
        public 抽象类()
        {
            Console.WriteLine("抽象类的默认构造方法(函数)");
        }
        public abstract void 抽象方法();//定义一个抽象方法,抽象方法必须包含在抽象类中。抽象方法只声明,不提供实现,所以没有{}。
        public void 普通方法() //普通方法要包括 {} 来实现。
        {
            Console.WriteLine("抽象类内的普通方法。");
        }
    }
    class 普通类 : 抽象类    //普通类继承抽象类后,必须实现抽象类中的 抽象方法。
    {
        //实现抽象方法,override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同。
        //用于扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现。
        //提供从基类继承的成员的新实现,而通过override声明重写的方法称为基方法。
        public override void 抽象方法() 
        {
            Console.WriteLine("在普通类内实现抽象类中的抽象方法。(必须的)"); 
        }
        public void 普通类内的普通方法()
        {
            Console.WriteLine("普通类内的普通方法。");
        }
    }
}

输出结果:

image.png


个人理解:抽象类比如是写一个游戏,这个游戏要有人物名字,人物年龄,人物初始等级,人物初始属性之类的,可以先把必要的信息抽象出来。在写其他类的时候可以直接继承,无须重复写。

扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://www.daobk.com/post/91.html

分享给朋友:

“abstract抽象类和抽象方法” 的相关文章

while语句:用while计算1到100之间整数的和

while语句:用while计算1到100之间整数的和

while语句:用while计算1到100之间整数的和            int s = 0;//定义一个整型变量s 赋值为0 &nb...

while语句:用 while continue实现计算1到100之间的除了能被7整除之外所有整数的和。

while语句:用 while continue实现计算1到100之间的除了能被7整除之外所有整数的和。

while语句:用 while continue实现计算1到100之间的除了能被7整除之外所有整数的和。            int i = 1;/...

foreach语句:依次读取数组中的元素。

foreach语句:依次读取数组中的元素。

foreach和for的区别:for可以不逐个遍历,比如每隔一个遍历一个,或者可以从后向前遍历。只能(只应该)在foreach对集合进行读,而不应该写。foreach语句:依次读取数组中的元素。         ...

面向对象版聊天机器人

面向对象版聊天机器人

机器人有不同的名字、维护自己的FullLevel,可以SayHello(我叫***),可以喂食(Eat(int foodCount)),可以对它说话(Speak),对异常情况(错误的喂饭数字,喂的太多撑死了)进行处理,有两个机器人供选择,一开始通过1、2数字选择聊天机器人。  &...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。