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

abstract抽象类和抽象方法

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

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抽象类和抽象方法” 的相关文章

类型转换Cast和Convert

类型转换Cast和Convert

把源类型赋值给目标类型,两个类型不一致的时候会发生类型转换。a=b,b是源,a是目标。隐式转换、显式转换。当目标类型一定能满足源类型转换过去后的要求的话就是隐式转换;如果当目标类型不一定能满足源类型转换过去后的要求的话就需要显式转换(程序员自己负责)。比如:把中国人转换为人是隐式转换,把人转换为中国...

函数:给我一个字符串,然后字符串使用我指定的分隔符来进行分割

函数:给我一个字符串,然后字符串使用我指定的分隔符来进行分割

函数就是将一堆代码进行重用的一种机制。函数就是一段代码,这段代码可能有输入的值(参数),可能会返回值。一个函数就像一个专门做这件事的人,我们调用它来做一些事情,它可能需要我们提供一些数据给它,它执行完成后可能会有一些执行结果给我们。要求的数据就叫参数,返回的执行结果就是返回值。有了函数写代码就像拼积...

字符串的处理

字符串的处理

C#中单个字符用单引号包含就是char类型,('a'),单引号中放且只能放一个字符。单个字符也可以表示为字符串,还可以有长度为0的字符串使用s.Length属性来获得字符串中的字符个数string可以看做是char的只读数组。char c = s[1];。C#中字符串有一个重要的特性...

字符串的分割:从日期字符串("2008-08-08")中分析出年、月、日;

字符串的分割:从日期字符串("2008-08-08")中分析出年、月、日;

string[] Split(params char[] separator):将字符串按照指定的分割符分割为字符串数组;string[] Split(char[] separator, StringSplitOptions options)将字符串按照指定的char分割符分割为字符串数组( opt...

发表评论

访客

看不清,换一张

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