接口(interface)

接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式。

接口实际上是一个约定:

如:IClonable, IComparable;

接口是抽象成员的集合:

ICloneable含有方法clone();

IComparable含有方法compare();

接口是一个引用类型,比抽象更抽象。

帮助实现多重继承:

接口的用处:

1.实现不相关类的相同行为,不需要考虑这些类的层次关系;

2.通过接口可以了解对象的交互界面,而不需要了解对象所在的类。例如:public sealed class String: ICloneable, IComparable, IConvertible, IEnumerable.

定义一个接口:

public interface IStringList //接口一般用I作为首字母

{
//接口声明不包括数据成员,只能包含方法、属性、事件、索引等成员
//使用接口时不能声明抽象成员(不能直接new实例化) void Add ( string s ) ; int Count{ get; } string this[int index] { get; set; } } //public abstract 默认,这两个关键词不写出来

实现接口:

class 类名 : [父类 , ] 接口, 接口, 接口, ..... 接口

{

public 方法 () { ...... }

}

显示接口成员实现:

在实现多个接口时,如果不同的接口有同名的方法,为了消除歧义,需要在方法名前写接口名: void IWindow.Close(){......};

调用时,只能用接口调用: (( IWindow ) f ).Close();

接口示例:

using System;

namespace TestInterface
{
interface Runner
{
void run();
}
interface Swimmer
{
void swim();
}
abstract class Animal //抽象类用作基类
{
abstract public void eat();
}
class Person : Animal, Runner, Swimmer
{
public void run()
{
Console.WriteLine("run");
}
public void swim()
{
Console.WriteLine("swim");
}
public override void eat()
{
Console.WriteLine("eat");
}
public void speak()
{
Console.WriteLine("speak");
}
}
class Program
{
static void m1(Runner r)
{
r.run();
}
static void m2(Swimmer s)
{
s.swim();
}
static void m3(Animal a)
{
a.eat();
}
static void m4(Person p)
{
p.speak();
} public static void Main(string [] args)
{
Person p = new Person();
m1(p);
m2(p);
m3(p);
m4(p);
Runner a = new Person();
a.run(); Console.ReadKey(true);
}
}
}

运行结果:

含有同名方法的多个接口继承:

using System;
class InterfaceExplicitImpl
{
static void Main()
{
FileViewer f = new FileViewer();
f.Test();
( (IWindow) f ).Close(); //强制转换,消除同名歧义 IWindow w = new FileViewer();
w.Close(); Console.ReadKey(true);
}
} interface IWindow
{
void Close();
}
interface IFileHandler
{
void Close();
}
class FileViewer : IWindow, IFileHandler
{
void IWindow.Close ()
{
Console.WriteLine( "Window Closed" );
}
void IFileHandler.Close()
{
Console.WriteLine( "File Closed" );
}
public void Test()
{
( (IWindow) this ).Close(); //不同接口含有同名方法,需要在方法前面写接口名
}
}

C#中的interface的更多相关文章

  1. iOS中,在类的源文件(.m)中,@interface部分的作用?

      此@interface部分为类扩展(extension). 其被设计出来就是为了解决两个问题的 其一,定义类私有方法的地方. 其二,实现public readonly,private readwr ...

  2. OC中的@interface和java中的区别以及 @implementation @protocol

      java 在java中的interface是‘接口’的意思,而java的类声明用class,即接口用interface声明,类是用class声明,是两个独立的部分. 只有在类声明要实现某个接口时, ...

  3. 【荐】详解 golang 中的 interface 和 nil

    golang 的 nil 在概念上和其它语言的 null.None.nil.NULL一样,都指代零值或空值.nil 是预先说明的标识符,也即通常意义上的关键字.在 golang 中,nil 只能赋值给 ...

  4. C#中的interface、virtual和abstract

    一.Abstract: abstract方法必须在abstarct类中声明,没有默认实现,子类必须实现. 二.Virtual: virtual方法可以声明在abstract类中,也可以声明在非abst ...

  5. c#中的interface abstract与virtual

    interface用来声明接口1.只提供一些方法规约,不提供方法主体  如  public interface IPerson {  void getName();//不包含方法主体  }2.方法不能 ...

  6. c#中的interface abstract与virtual介绍

    abstract 与virtual : 方法重写时都使用 override 关键字,interface中的方法和abstract方法都要求实现  interface用来声明接口1.只提供一些方法规约, ...

  7. java中的interface

    转载: Java不支持多重继承,即一个类只能有一个父类 为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口 接口是抽象方法和常量值定义的集合,是一种特殊的抽象类接口中只包含常量和方法的定 ...

  8. java中的interface接口

    接口:java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法. java接口的特点如下: 1.java接口不能被实例化 2.java接口中声明的成员自动被设置为public,所以不存在pr ...

  9. java 中的interface是否继承object

    首先我们从C++说起, c++可以多继承.也就是一个类型 --- class,可以继承自2个以上的父类型.多继承导致一个问题,很多人知道.例如,如果类型B,类型C均继承自类型A.然后类型D继承自类型B ...

  10. SV中的Interface和Program

    Interface:SV中新定义的接口方式,用来简化接口连接,使用时注意在module或program之外定义interface,然后通过'include来添加进工程. interface  arb_ ...

随机推荐

  1. 一:c语言(数据类型和运算符)

    #include <stdio.h> /*就是一条预处理命令,它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作.*/ int main() /*C程序就是执行主函数 ...

  2. 实现跨云应用——基于DNS的负载均衡

    “公有云可以作为传统IT资源的延展,能帮助客户应对不断变化的需求”——这是我们在向客户介绍公有云产品时经常说的一句话.我们来看一个具体的需求: 某客户有一个web站点,部署在自有的数据中心(on-pr ...

  3. 大话设计模式C++版——表驱动法改造简单工厂

    上回<大话设计模式C++版——简单工厂模式>中指出了简单工厂模式的缺陷,即违背了开发—封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码 ...

  4. [转]Oracle 分组聚合二种写法,listagg和wmsys.wm_concat

    本文转自:http://www.cnblogs.com/ycdx2001/p/3502495.html with temp as( select 'China' nation ,'Guangzhou' ...

  5. DPM检测模型 训练自己的数据集 读取接口修改

    (转载请注明作者和出处 楼燚(yì)航的blog :http://www.cnblogs.com/louyihang-loves-baiyan/ 未经允许请勿用于商业用途) 本文主要是针对上一篇基于D ...

  6. Eclipse较为常用快捷键

    今天在学习Eclipse的使用时,Mark了一些较为常用的快捷键,拿出来和大家分享一下: Ctrl+1 快捷修复 Ctrl+D 快捷删除行 Shift+Enter 在当前行任意位置光标跳转到下一行 C ...

  7. 我的Github之旅(一)

    第一站:本地环境中的Github配置 1.参考链接 作为初学者,需要了解的有[本地环境中的github配置(基于mac)][1],以及git知识,这里推荐一个网站[猴子都能懂的Git入门][2],最后 ...

  8. memcache的安装和使用

    Memcache Memcached是一个高性能的分布式缓存系统.memcached自身不会实现分布式,分布式是由程序来实现的. Memcached一旦安装之后,自身进行管理!预申请一个很大的内存空间 ...

  9. HTML 学习笔记 CSS(选择器3)

    CSS 属性选择器 属性选择器可以根据元素的额属性以及属性值来选择元素 例子1 如果 你希望把包含title的所有元素变成红色 *[title] {color:red} 例子2 与上面类似 可以只对有 ...

  10. domReady方法(dom加载完成执行回调)

    var domReady = function( fn ) { var isReady = false, ready = function(){ if(!isReady){ typeof fn === ...