博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#3.0学习笔记(8)浅谈接口interface
阅读量:6453 次
发布时间:2019-06-23

本文共 3747 字,大约阅读时间需要 12 分钟。

1, 接口的定义?

  答:接口表示一组函数成员而不实现成员的引用类型,类和结构可以实现接口。

 

2, 接口的意义及为什么要使用接口?

  要理解接口的意义以及为什么它是有用的,让我们先来看看下面的代码,它接受了一个没有排序的整数数组并且按升序进行排序。

class Program     {
static voidMain(string[] args) {
var myInt = new[] { 20,4,16,9,2};//隐式创建整形数组。 Array.Sort(myInt);//调用Array类的Sort方法对数组进行排序,默认为升序。 foreach (var item in myInt)//使用foreach语句遍历数组。 {
Console.Write("{0}",item); Console.Write(""); } Console.ReadKey(); } }

 

程序输出结果为:

 Sort方法在int数组上工作得很好,但是如果我们尝试在自己的类上使用会发生什么样的结果呢?如下代码所示:

class Program     {
static voidMain(string[] args) {
var myInt=new []{
20,4,16,9,2};//隐式创建整形数组。 MyClass[] mc=new MyClass[5];//创建MyClass对象数组。 for (int i = 0; i < 5; i++)//初始化数组 {
mc[i] = new MyClass(); mc[i].TheValue=myInt[i]; } Array.Sort(mc);//调用Sort方法时会引发异常。 foreach (var item in mc) {
Console.Write("{0}",item); Console.Write(""); } Console.ReadKey(); } } class MyClass//自定义类MyClass {
public int TheValue; }

 

程序会抛出一个异常,如下图:

 

这是什么原因呢?Sort不工作的原因是,对于用户自定义对象的数组而言,它不知道如何比较用户自定义对象和确定它们的次序,它需要数组中的对象实现IComparable接口。在Sort运行时,它通过调用元素的CompareTo方法并传入另外一个元素的引用作为参数来实现数组的一个元素和另一个元素的比较。

所以,我们可以通过让类实现IComparable接口来使Sort方法可以用于MyClass对象。

代码如下:

class Program     {
static voidMain(string[] args) {
var myInt = new[] { 20,4,16,9,2}; MyClass[] mc = new MyClass[5]; //创建类MyClass对象的数组。 for (int i = 0; i < 5; i++) //初始化数组 {
mc[i] = new MyClass(); mc[i].TheValue=myInt[i]; } PrintOut("原始数组顺序:", mc);//调用静态PrintOut方法输出初始数组。 Array.Sort(mc); PrintOut("经过Sort后的顺序:", mc);//调用静态PrintOut方法输出排序后的数组。 Console.ReadKey(); } static void PrintOut(string s, MyClass[] mc)//定义静态方法PrintOut实现遍历数组并输出数组元素。 {
Console.Write(s); foreach (var item in mc) {
Console.Write("{0}",item.TheValue); Console.Write(""); } Console.WriteLine();//换行 } } class MyClass : IComparable //类实现接口 {
public int TheValue; public int CompareTo(object obj) //接口成员方法实现 {
MyClass mc=(MyClass)obj; if (this.TheValue < mc.TheValue) return -1; if (this.TheValue > mc.TheValue) return 1; return 0; } }

 

程序输出结果为:

 在MyClass类中实现接口IComparable接口的示意图:

 

3, 声明接口?

  例如:

interface IMyInterface1 //声明接口IMyInterface1     {
int Do1(int i, long l); double Do2(string s, long l); }

 

  需要注意以下几点:

  1>    声明接口使用interface关键字。

  2>    接口名称必须从大写的I开始(如:ISaveable)。

  3>    接口函数成员的声明不能包括任何实现代码,而在每一个成员声明的主体的后面必须使用分号。

  4>    接口声明可以有任何的访问修饰符public,protected,private等,但是接口的成员是隐式public的,不允许有任何访问修饰符,包括public。

 

4, 实现接口?

  只有类和结构才能实现接口。要实现接口,类或结构必须注意以下几点:

  1>    在基类列表中包括接口名称。

  2>    为每一个接口的成员提供实现。

  3>    如果类从基类继承并实现接口,基类列表中的基类名称必须放在任何接口之前。

  例如:

interface IMyInterface1 //声明接口IMyInterface1     {
int Do1(int i, long l); double Do2(string s, long l); } class MyClass : IMyInterface1 //实现接口 {
int Do1(int i, long l) //实现接口成员 {
//todo:方法体 } double Do2(string s,long l) {
//todo:方法体 } }

 

5, 简单接口的示例?

  代码如下:

interface IIfc1 //声明接口     {
void PrintOut(string s); } class MyClass : IIfc1 //实现接口。 {
public void PrintOut(string s) //实现接口成员 {
Console.WriteLine("Calling through:{0}",s); Console.ReadKey(); } } class Program {
static voidMain(string[] args) {
MyClass mc = new MyClass(); //创建实例 mc.PrintOut("object"); //调用类对象的方法。 } }

 

程序输出结果为:

 

 以上是我的简单总结,今天先写到这儿,欢迎大家点评,谢谢!

转载地址:http://npyzo.baihongyu.com/

你可能感兴趣的文章
django之Model的内部类Meta选项说明
查看>>
UTF的字节序和BOM
查看>>
IE8 没有内容的盒子,如果有定位,浮现在其他盒子上 可能会有点击穿透没有作用的情况...
查看>>
windows查看进程
查看>>
Ubuntn16.04+OpenCV3.1+CUDA8.0+cudnn5.1+caffe配置及问题集锦
查看>>
POJ 3207 Ikki's Story IV - Panda's Trick【2-SAT】
查看>>
HDoj 2602 Bone Collector 01背包
查看>>
spring 配置中相关属性的含义:
查看>>
CSS(二)样式优先级别和css的单位刻度
查看>>
第六章 循环
查看>>
内置函数
查看>>
在Ubuntu里搭建spark环境
查看>>
【Android】用MediaRecorder录制视频太短崩的问题
查看>>
区块链代币(Token)笔记 — — 术语
查看>>
坐标系与基本图元(3)
查看>>
A.华华听月月唱歌
查看>>
Form界面设置只读
查看>>
Ros学习之开发环境Roboware Studio
查看>>
华为手机,删除安装包apk
查看>>
hdu2050 折线分割平面---递推
查看>>