1,常用接口及其定义

public interface IDisposable{
void Dispose(); } public interface IEnumerable}{
IEnumerator GetEnumerator(); } public interface IEnumerable<T>:IEnumerable{
IEnumerator GetEnumerator<T> GetEnumerator()
} public interface ICollection<T>:IEnumerable<T>,IEnumerable {
void Add(T item);
void Clear();
Boolean Contains(T item);
void CopyTo(T[] array,int32 arrayIndex);
int32 Count{get;}
Boolean IsReadOnly {get;}}
  • 接口继承:接口继承表示某类如果继承该接口,则必须实现该接口的继承接口的方法.
  • 比如 ,必须实现这些方法.
     public class MyClassForInterface<T> : ICollection<T> where T:class,new()
    {
    public int Count => throw new NotImplementedException(); public bool IsReadOnly => throw new NotImplementedException(); public void Add(T item)
    {
    throw new NotImplementedException();
    } public void Clear()
    {
    throw new NotImplementedException();
    } public bool Contains(T item)
    {
    throw new NotImplementedException();
    } public void CopyTo(T[] array, int arrayIndex)
    {
    throw new NotImplementedException();
    } public IEnumerator<T> GetEnumerator()
    {
    throw new NotImplementedException();
    } public bool Remove(T item)
    {
    throw new NotImplementedException();
    } IEnumerator IEnumerable.GetEnumerator()
    {
    throw new NotImplementedException();
    }
    }

2,当实现接口的时候,的一些结果

 public class Base : IDisposable
{
public void Dispose()//实现接口函数,未加virutal,则默认是 virtual sealed---无法重载.
{
Console.WriteLine("Base's Dispose!");
}
}
public class Derived : Base, IDisposable
{
public new void Dispose()//new,关键字表明这是重新实现的Dispose方法.override...表明是重载的方法.
{
Console.WriteLine("Derived's Dispose!");
}
}
public static class CallBaseDerivedOfInterface
{
public static void CallBaseAndDerived()
{
Base b = new Base();//b的类型,和b的对象的类型都是Base;
Derived d = new Derived();//d的类型和d的对象的类型都是Derived
b.Dispose();//调用b的类型的Dispose
d.Dispose();//调用d的类型的Dispose
((IDisposable)b).Dispose();//调用b的对象的类型的Dispose,Base.Dispose
((IDisposable)d).Dispose();//调用d的对象的类型的Dispose,Derived.Dispose
b = new Derived();//b的类型是Base,b的对象的类型是Derived
b.Dispose();//调用Base.Dispose
((IDisposable)b).Dispose();//调用b的对象的Dispose---Derived.Dispose
}
}//结果Base's Dispose!
Derived's Dispose!
Base's Dispose!
Derived's Dispose!
Base's Dispose!//----调用Base.Dispose
Derived's Dispose!//---调用Derived.Dispose

3,隐式和显式接口方法实现

 public class SimpleType : IDisposable
{
public void Dispose()
{
Console.WriteLine("Dispose");
}
}

则该类的类型的方法表里将包含:

  • Object定义的所有虚实列方法
  • IDisposeable定义的所有接口方法.Dispose();
  • SimpleType 引入的新方法Dispose();

在本列中 和上列中,调用 b.Dispose()---则调用SimpleType 定义的Dispose()方法.

调用((IDispose)b).Dispose---调用的是接口的Dispose()方法--其指向上一个方法.

 public class SimpleType : IDisposable
{
public void Dispose()
{
Console.WriteLine("Dispose");
}
void IDisposable.Dispose()//显示的接口实现
{
Console.WriteLine("IDispose.Dispose");
}
}
SimpleType st = new SimpleType();
st.Dispose();
((IDisposable)st).Dispose();//只有显示的接口类型 才能够调用.//Dispose IDispose.Dispose

clr via c# 接口的更多相关文章

  1. CLR via C#(17)--接口

    CLR不允许继承多个基类,但是可以继承多个接口.凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例. 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全 ...

  2. [CLR via C#]13. 接口

    一.类和接口继承 在Microsoft.Net Framwork中,有一个名为System.Object的类,它定义了4个公共实例方法:ToString, Equals, GetHashCode和Ge ...

  3. <NET CLR via c# 第4版>笔记 第13章 接口

    13.1 类和接口继承 13.2 定义接口 C#用 interface 关键字定义接口.接口中可定义方法,事件,无参属性和有参属性(C#的索引器),但不能定义任何构造器方法,也不能定义任何实例字段. ...

  4. 重温CLR(九) 接口

    对于多继承(multiple inheritance)的概念,许多程序员并不陌生,他是指一个类从两个或多个基类派生的能力.例如,假定TransmitData类的作用是发送数据,ReceiveData类 ...

  5. CLR via c#读书笔记九:接口

    1.接口对一组方法签名进行了统一命名.接口还能定义事件.无参属性和有参属性(C#的索引器). 2.c#禁止接口定义任何一种静态成员. 3.C#编译器要求将实现接口的方法标记为public.CLR要求将 ...

  6. CLR via C#深解笔记六 - 泛型

    面向对象编程一个好处就是“代码重用”,极大提高了开发效率.如是,可以派生出一个类,让它继承基类的所有能力,派生类只需要重写虚方法,或添加一些新的方法,就可以定制派生类的行为,使之满足开发人员的需求. ...

  7. [CLR via C#]12. 泛型

    泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算法,比如排序.搜索.交换等.但是定义算法的开 ...

  8. 由浅入深学习.NET CLR 系列:目录

    经过对Android的一阵折腾,些许熟悉了一些Java的东东,又开始转战.NET.我觉得学习最好和工作不要相离太远,才会更加随笔随意,索性整理一些比较系统的.NET的基础知识学习学习.一提起学习.NE ...

  9. CLR总览

    Contents 第1章CLR的执行模型... 4 1.1将源代码编译成托管代码模块... 4 1.2 将托管模块合并成程序集... 6 1.3加载公共语言运行时... 7 1.4执行程序集的代码.. ...

随机推荐

  1. UIKit, AppKit, 以及其他API在多线程当中的使用注意事项

    UIKit, AppKit, 以及其他API在多线程当中的使用注意事项 Overview The Main Thread Checker is a standalone tool for Swift ...

  2. 'NoneType' object has no attribute shape

    使用cv2读取图片时,输出图片形状大小时出现报错“ 'NoneType' object has no attribute shape”,后来排查发现读取图片的返回值image为None, 这就说明图片 ...

  3. H5新增特性

    1.pattern:写正则,但是需要和form表单连着用 2.WebSocket "网络套接字", 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.在 W ...

  4. CentOS7安装docker以及错误解决

    今天在公司电脑上安装docker出现了一些问题,原先是直接用yum安装docker,一次就成功了,由于公司的网络问题导致docker安装完出现了一些问题,客户端启动了,服务端一直启动不了:Job fo ...

  5. pycharm版本下载地址

    https://www.runoob.com/w3cnote/pycharm-windows-install.html   下载社区版本,因为免费 其余按照默认安装即可

  6. PCA技术的自我理解(催眠

    Principal component analysis(PCA) 中文就是主成成分分析.在学数学建模的时候将这分为了评价类的方法(我实在是很难看出来,在机器学习中是属于无监督学习降维方法的一种线性降 ...

  7. Arduino系列之DHT11模块采集数据(一)

    下面我将介绍DHT11模块的相关用法 DHT11数字传感器概述:是一款含有已校准数字信号输出的温湿度复合传感器 .它应用专用的数字模块采集技术和温湿度传感技术 ,确保产品具有极 高的可靠性与卓越的长期 ...

  8. webpack--运行npm run dev自动打开浏览器运行首页的两种方式以及热加载

    作为开发人员,我们在修改了代码之后,在vscode终端运行npm run dev指令后,希望它可以自动打开浏览器方便我们调试,有两种方式可以实现: 自动打开浏览器的两种方式: 方式一: 1.webpa ...

  9. ros之自定义服务数据

    如何自定义服务数据 string name Uint8 age Uint8 sex Uint8 unknown =0 Uint8 male =1 Uint8 female = 2 (上面的是Reque ...

  10. linux入门系列10--firewalld防火墙管理

    上一篇文章学习了用户及文件相关权限,本篇继续学习防火墙技术. 防火墙作为公网与内网之间的保护屏障,对系统至关重要.防火墙又分为硬件防火墙和软件防火墙,主要功能都是依据设置的策略对穿越防火墙的流量进行过 ...