C# for Unity 编程语言快速入门教程(连载8)---C#OOP编程之抽象类与接口
C#的抽象类与接口,是C#OOP编程中非常重要的概念,对于开发出“高内聚、低耦合”的优秀项目具有重要的作用。
C#抽象类是用关键字abstract 表示的,它即可以修饰类(抽象类),也可以修饰方法(抽象方法)。抽象类主要的作用是:列举一个类所需要的行为,提供一系列的规定,约束子类行为。
C#抽象类与抽象方法具备以下重要规则:
1:抽象类不能被实例化。
2:抽象类不明确提供具体 方法实现。(但可以包含普通的方法)
3:定义基类(父类)中的抽象方法,则派生类(子类)必须重载(重写)该方法。
4:抽象方法一定属于抽象类,但抽象类不一定要包含抽象方法。
5:抽象方法不能是私有的,而且抽象方法及其重载方法的访问限制应当相同。
6:抽象方法不能使用virtual 关键字进行修饰。
7:抽象类不能是密封或静态的 。
8:抽象类必须由其子类实现它的抽象方法,除非子类也是抽象类。
9:继承抽象类的派生类,必须使用override 实现抽象方法。
10:抽象方法一定属于抽象类,但抽象类不一定要包含抽象方法。
我们生活中的接口是: “不同物理设备与软件程序实现沟通与数据传输的规格与标准”(例如:USB接口,即可以应用在鼠标链接上,也可以应用在移动硬盘、USB盘、手机、数码相机、充电宝....)
C#中的接口就是:“某个事物对外提供的一些功能的申明”,我们使用interface 关键字来声明一个接口,注意这里接口是一个与类“平行”的编程单位,相互之间没有隶属关系。
C#的接口具备以下重要规则:
1: 接口可以继承,类似类的继承。
2: 接口可以实现多重继承,类不可以。
3: 可以把接口理解为更纯的抽象类,因为接口中所有的方法都是抽象的,没有普通方法。
4: 接口和抽象类不能被实例化。
5: 接口的任何派生实现类,都必须实现接口的所有方法。
6: 接口不允许有任何构造函数或字段。
7: 接口成员总是公共的,不能声明虚拟和静态的。
8: 接口中不允许指定任何访问修饰符,(隐式为public)不需要访问修饰符。
9: 类不允许多继承,但接口允许多继承。
好的编程习惯: 使用接口名作为方法的前缀,这称为“显示接口实现”。
对于明确指定了接口的方法,就不再允许使用修饰符,一律为 public。
以上两篇文章我们学习了方法重载,方法重写,抽象类,抽象方法,接口等。现在总结一些概念之间的区别点:
1:不能同时使用 virtual 和 override 修饰一个方法。
2:虚拟方法不能是私有的。
3:对于 interface 、virtual、override、sealed 关键字的理解:
interface: 引入一个方法的名称
virtual: 方法的第一个实现。
override: 方法的另一个实现。
sealed: 方法的最后一个实现。
目前关于C#基础编程,截至本篇笔者提供了8篇技术介绍性文章,现在提供从类的访问修饰符到目前接口的一些典型学习习题,供C#初学者学习之用。
编程题目:
1: 学习定义类与访问修饰符。
1.1>: 已知交通工具类定义如下。
class Vehicle
{
private int _length; //长度
private int _width; //宽度
public void Drive(){}; //驾驶方法
}
要求:(1)实现设个类;(2)定义并实现一个小车类car,是它的派生类,小车本身的私有属性有载人数,小车的方法有init(设置车轮数、重量和载人数),get passenger(获取载人数),print(打印车轮数、重量和载人数)。
2: 学习继承
2.1>: 编写一个学生和教师的数据输入和显示程序,学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的基类。
3: 方法重载(静态多态性)
3.1>: 利用多态性实现多功能计算器:
A)定义方法名为computeMethod 的方法,实现加法器。
B)再定义方法名为computeMethod 的方法,实现具备加减乘除综合计算功能。
C)在main 方法中调用以上方法,且测试。
3.2>: 利用多态性实现如下功能。
A)定义一个Father 类,利用构造方法的重载概念定义三个构造方法。
B)定义Child 类继承Father类,在Child的构造方法中分别调用父类不同的构造方法。
4: 方法重写
4.1>: 设计一个基类,在其中创建方法MConvert,这个方法接受一个代表公里数的参数,将其转换为对等的英里数之后,然后创建一个继承此类的子类,增加可将输入的公斤数转换为磅的新方法 KConvert, 最后产生子类的实例对象, 测试这两个功能。
提示信息:
1千米(公里) = 0.62英里
1千克(公斤) = 2.2磅
4.2>: 调整上一题的内容,将其中的MConvert方法声明为virtual, 然后在子类中进行覆写,以其所接受的参数为正方形边长,转换为英里后计算其面积。
4.3>: 创建一个类,重写ToString() 方法, 当其被引用的时候,能够输出此类对象的说明文字,如下: “测试用的myObject 类对象”
5: 抽象类、抽象方法
5.1>: 编写一个程序,求圆、圆内接正方形和圆外切正方形的面积和周长。要求设计抽象基类、抽象方法,使用动态多态性。
提示信息:
公式: 勾股定义: 直角三角形中两边长平方的和等于第三边的平方:a*a+b*b=c*c
圆的半径使用 r:
内切正方形的边长=r*r+r*r=x*x
x=sqrt(2(r*r))
内切正方形面积
x*x
内切正方形周长
4x
外切正方形面积
(r*2)*(r*2)
外切正方形周长
(r*2)*4=8r
形状: shape
圆: circle
正方形: square、
面积: area.
周长: length.
5.2>:下面Shape类是一个表示形状的抽象类,Area ( )为求图形面积的函数。请从Shape类派生梯形类(Trapezoid)、圆形类(Circle),三角形类(Triangle),并给出具体的求面积函数。其中,所有派生类计算面积需要用到的参数由构造函数给出,梯形面积计算需要上底、下底和高,三角形面积需要底和高,圆形面积需要半径。
形状的抽象类声明如下:
abstract class Shape {
abstract public double Area( );
}
6: 接口、多重接口
6.1>:A)定义Calculate接口,
接口文件如下:
interface Calculate
{
void getArea(); //计算圆面积。
void getZC(); //计算圆周长
}
B) 定义circularity 类,实现接口Calculate. 且调试后输出结果。
6.2>: 设计一个类TClass, 继承下面的接口IMeasure, 实现其中的Length() 与 Area()方法,来计算特定长度等边三角形的边长和面积。
interface IMeasure
{
int Length(int s);
int Area(int s);
}
6.3> 承上题,设计一个测试程序,创建TClass 的实例对象,调用其中的方法计算边长为10的三角形面积和周长。
6.4>: 承上题,设计一个测试程序,创建TClass 的实例对象,将其转型为 IMeasure 类型,调用其中的方法来计算边长为10的三角形面积和周长。
6.5>: 另外设计一个新的类,同时继承下面的接口 IAMeasure 及上面第2题的IMeasure,除了提供对特定长度等边三角形的边长与面积的计算方法外,还实现了IAMeasure的Area()成员,提供对正方形面积的计算方法。
interface IAMeasure
{
int Area(int s);
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。