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

abstract抽象类和抽象方法

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

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

数组:​从一个整数数组中取出最大的整数。

数组:​从一个整数数组中取出最大的整数。

保存多个值。任意类型都可以声明数组。int[] nums = {5,3,8};//数组可以直接赋值。 int[] nums = new int[3];//也可以先声明数组 不赋值。   &...

字符串的处理

字符串的处理

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

String类常用函数

String类常用函数

String类常用函数ToLower():得到字符串的小写形式。注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回。ToUpper():得到字符串的大写形式; Trim()去掉字符串两端的空白。s1.Equals(s2, StringCom...

字符串函数详解

字符串函数详解

字符串替换:string Replace(string oldValue, string newValue)将字符串中的出现oldValue的地方替换为newValue。例子:名字替换。取子字符串:string Substring(int startIndex),取从位置startIndex开始一直...

发表评论

访客

看不清,换一张

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