abstract抽象类和抽象方法

原创 小道  2018-08-31 16:10:21  阅读 629 次 评论 0 条
摘要:

abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的基类,不能实例化,而且abstract修饰的成员在派生类中必须全部实现,不允许部分实现,否则编译异常.在方法或属性声明中使用abstract修饰符以指示方法或属性不包含实现。含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是不能被实例化,可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例;除此以外,具有类的其他特性;重要的是抽象类可以包

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
版权声明:本文为原创文章,版权归 小道 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?