C#中的interface
接口(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的更多相关文章
- iOS中,在类的源文件(.m)中,@interface部分的作用?
此@interface部分为类扩展(extension). 其被设计出来就是为了解决两个问题的 其一,定义类私有方法的地方. 其二,实现public readonly,private readwr ...
- OC中的@interface和java中的区别以及 @implementation @protocol
java 在java中的interface是‘接口’的意思,而java的类声明用class,即接口用interface声明,类是用class声明,是两个独立的部分. 只有在类声明要实现某个接口时, ...
- 【荐】详解 golang 中的 interface 和 nil
golang 的 nil 在概念上和其它语言的 null.None.nil.NULL一样,都指代零值或空值.nil 是预先说明的标识符,也即通常意义上的关键字.在 golang 中,nil 只能赋值给 ...
- C#中的interface、virtual和abstract
一.Abstract: abstract方法必须在abstarct类中声明,没有默认实现,子类必须实现. 二.Virtual: virtual方法可以声明在abstract类中,也可以声明在非abst ...
- c#中的interface abstract与virtual
interface用来声明接口1.只提供一些方法规约,不提供方法主体 如 public interface IPerson { void getName();//不包含方法主体 }2.方法不能 ...
- c#中的interface abstract与virtual介绍
abstract 与virtual : 方法重写时都使用 override 关键字,interface中的方法和abstract方法都要求实现 interface用来声明接口1.只提供一些方法规约, ...
- java中的interface
转载: Java不支持多重继承,即一个类只能有一个父类 为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口 接口是抽象方法和常量值定义的集合,是一种特殊的抽象类接口中只包含常量和方法的定 ...
- java中的interface接口
接口:java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法. java接口的特点如下: 1.java接口不能被实例化 2.java接口中声明的成员自动被设置为public,所以不存在pr ...
- java 中的interface是否继承object
首先我们从C++说起, c++可以多继承.也就是一个类型 --- class,可以继承自2个以上的父类型.多继承导致一个问题,很多人知道.例如,如果类型B,类型C均继承自类型A.然后类型D继承自类型B ...
- SV中的Interface和Program
Interface:SV中新定义的接口方式,用来简化接口连接,使用时注意在module或program之外定义interface,然后通过'include来添加进工程. interface arb_ ...
随机推荐
- System.getProperty()引起的悲剧--您的主机中的软件中止了一个已建立的连接
我已无法形容此刻我的心情.. 本来是已经写好的netty5的demo程序,server和client之间创建tcp长连接的..然后随便传点数据的简单demo..然后今天试了一下tcp粘包的例子,用到了 ...
- 【转帖】4412ARM开发板学习笔记(一)
本文转自迅为论坛:http://www.topeetboard.com 新手在进行开发学习前,建议先看01-迅为电子开发板入门视频.对开发板和开发环境有一定的了解后,不要盲目接线开机.以下是个人的一点 ...
- win10 右键菜单添加使用gvim打开方式
①打开注册表编辑器,开始-->运行-->regedit ②定位到:HKEY_CLASSSES_ROOT---> * --->Shell,在Shell 上右击,新建---> ...
- shiro和quartz同时存在于项目中,解决冲突的方案
shiro自带了quartz定时任务,不过版本是1.3的 很多项目都会使用shiro,另外定时任务也会使用,quartz的版本2.2目前和shiro不兼容 有人通过修改源码可以解决 我这边是这样解决的 ...
- Mecanim分析
前言 目前我还只是学习到Mecanima的初级阶段,看完了阿赵的日志<Unity3D 4.0新功能:Mecanim动画系统基础教程>,对Mecanima的了解更深入了一些,谢谢他的分享. ...
- [No000020]背单词提不起兴趣怎么办?
- 移动开发webapp开发常用meta设置手机浏览器全屏模式
1.WebApp全屏模式: <meta name="viewport" content="width=device-width,initial-scale=1.0, ...
- Java 读取xlsx
读取特别大的xlsx文件时, 需要使用StreamingReader, 可以控制JVM内存峰值在200M以内 InputStream is = new FileInputStream(new File ...
- Centos下Tomcat 安装Apache Portable Runtime
APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心. APR有很多用途,包括访问高级IO功能(例如sendfile,epo ...
- JS 中如何判断 undefined 和 null
JS 中如何判断 undefined JavaScript 中有两个特殊数据类型:undefined 和 null,下节介绍了 null 的判断,下面谈谈 undefined 的判断. 以下是不正确的 ...