当前位置:首页 > Windows程序 > 正文

c#复习系列之抽象方法和接口

2021-03-20 Windows程序

最近一直在复习关于c#的知识点,发现里面有好多重要的内容(也是自己以前不懂的地方),特别是面向对象的部分,同时又是我们学习中的重点和难点,抽象类的接口又是多态的基础(也是实现手段),所以今天在这里对接口和抽象类做一下总结,拿出来和大家分享一下,让我们共同的教学交流与进步吧!

一 抽象类

(一)什么是抽象类和抽象方法?

1)抽象类的定义:简单的理解就是描述共性的类,抽象类中不考虑具体的实现,只是定义具有共性且必须实现的方法(也就是抽象方法),其中声明时用abstract关键字。

2)重点解释:抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的;抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

3)抽象方法的定义:定义在抽象类里面的方法,并且是没有方法内容的,其中只有一个方法名和参数列表的方法。并以;结尾。为了标注它的与众不同,在它的返回类型前加abstract

4)重点解释:抽象方法声明在抽象类里面,是派生类的行为的一个抽象,里面没有具体的方法的实现,其中声明时也用abstract关键字。

5)现实例子:如老师的具体任务是教学,具体教什么内容,如何教,每个老师都有自己独特的方法和技巧,对教学的这个动作就可以提取出来作为抽象的方法,而不实现里面的具体教学内容,这个实现,是有具体的任课老师用自己的授课方式去实现。

(二)抽象类和抽象方法的实现方式

接下来,我们直接看一个代码,在代码中讲解会比较好一点。

题目需求是:设计一个立方体的抽象类,从而求出正方体,长方体的体积和表面积、

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 抽象类 { //抽象类的声明,实现,调用的演示 public abstract class AreaAndVolume { public abstract double GetAread();//抽象方法,没有方法的具体实现,以;结束 double GetVolume() //非抽象方法,可以包含方法的具体实现 { return 0; } public int age; //这里并没有报错 AreaAndVolume fangfa();//可以包含构造函数 } //正方体类,继承抽象类,实现抽象类里面的具体行为 public class Cub : AreaAndVolume { double side; public Cub(double side) //构造函数,初始化side { this.side = side; } //通过重写抽象方法,从而实现具体的求表面积的行为 public override double GetAread() { return side * side * 6; } //非抽象方法,正常方式实现即可 public double GetVolume() { return side * side * side; } } //长方体类的具体实现方式与正方体的一样 public class Cubeid : AreaAndVolume { public double length; public double weight; public double height; public Cubeid(double length, double weight, double height) { this.length = length; this.height = height; this.weight = weight; } public override double GetAread() { return ((length * weight) + (length * height) + (weight * height)) * 2; } public double GetVolume() { return height * weight * length; } } class Program { static void Main(string[] args) { Cub c1 = new Cub(3); //实例化对象,通过构造函数赋值 Cubeid cu1 = new Cubeid(2, 5, 6); //方法的具体调用 Console.WriteLine("正方体的表面积是:{0},体积是:{1}", c1.GetAread(), c1.GetVolume()); Console.WriteLine("长方体的表面积{0},体积是:{1}", cu1.GetAread(), cu1.GetVolume()); Console.ReadLine(); } } }

运行结果:

(三)抽象类的特性

 

(1)抽象类不能被实例化

(2)抽象类可以包含抽象方法和抽象访问器,可以包含构造函数和实例变量。

(3)不能用sealed修饰符修改抽象类,因为抽象类本身就是用来给其他类继承的

(4)抽象类的非抽象子类必须实现其继承的所有抽象方法和抽象访问器

(四)抽象类的构造函数

 

(1)不要再抽象类中定义publicprotected internal访问权限的构造函数

(2)应在抽象类中定义protectedprivate访问权限的构造函数

3)如果在抽象类中定义一个protected构造函数,则在实例化派生类时,基类可以执行初始化任务

(五)抽象方法的注意事项

 

(1)抽象方法是隐式的虚方法

(2)抽象方法只允许声明在抽象类中

(3)抽象方法不能提供实际的实现,所以没有方法体;抽象方法的实现是在非抽象的派生类中以override重写实现的

(4)抽象方法声明中不可以使用static或者virtual修饰符

(5)abstract关键字不能修饰静态方法或静态属性

二 接口

抽象类的讲解先告一段落,我们接下来讲解和抽象类比较像的接口

(一)什么是接口?

1)接口的定义: 用来定义一种程序的协定,可以定义属于任何类或结构的一组相关行为。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/64332.html