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. HTML5浏览器支持及兼容性处理

    1.现代的浏览器都支持HTML5. 2.所有浏览器不管是新的还是旧的对无法识别的元素会作为内联元素自动处理. 3.HTML5定义了8个HTML语义元素,所有这些元素都是块级元素,为了能让旧版本的浏览器 ...

  2. mysql安装教程linux

    https://www.cnblogs.com/YangshengQuan/p/8431520.html 设置sql远程访问

  3. Charles的安装及使用过程

    一.charles的使用 1.1  charles的说明 Charles其实是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的.该 ...

  4. ios--->上下拉刷新控件MJRefresh

    上下拉刷新控件MJRefresh 一.类结构 MJRefreshComponent.h MJRefreshHeader.h MJRefreshFooter.h MJRefreshAutoFooter. ...

  5. ElasticSearch快速入门

    知识储备 学习ElasticSearch之前可以先了解一下lucene,这里是我整理的一篇关于lucene的笔记(传送门),对搜索框架有兴趣的还可以了解一下另一款企业级搜索应用服务器---solr(传 ...

  6. 如何获取 C# 类中发生数据变化的属性信息

    一.前言 在平时的开发中,当用户修改数据时,一直没有很好的办法来记录具体修改了那些信息,只能暂时采用将类序列化成 json 字符串,然后全塞入到日志中的方式,此时如果我们想要知道用户具体改变了哪几个字 ...

  7. 二、Linux系统硬链接和软链接详细介绍与实践

    链接的概念 在linux系统中,链接可分为两种:一种被称为硬链接(Hard LinK),另一种被称为软链接或符号链接(Symbolic Link).在默认不带参数的情况下,执行ln命令创建的链接是硬链 ...

  8. HDU_3410_单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=3410 初探单调栈,从左往右,求l,从右往左,求r. #include<iostream> #incl ...

  9. 用python制作训练集和测试集的图片名列表文本

    # -*- coding: utf-8 -*- from pathlib import Path #从pathlib中导入Path import os import fileinput import ...

  10. Go语言实现:【剑指offer】整数中1出现的次数(从1到n整数中1出现的次数)

    该题目来源于牛客网<剑指offer>专题. 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10.1 ...