clr via c# 接口
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# 接口的更多相关文章
- CLR via C#(17)--接口
CLR不允许继承多个基类,但是可以继承多个接口.凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例. 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全 ...
- [CLR via C#]13. 接口
一.类和接口继承 在Microsoft.Net Framwork中,有一个名为System.Object的类,它定义了4个公共实例方法:ToString, Equals, GetHashCode和Ge ...
- <NET CLR via c# 第4版>笔记 第13章 接口
13.1 类和接口继承 13.2 定义接口 C#用 interface 关键字定义接口.接口中可定义方法,事件,无参属性和有参属性(C#的索引器),但不能定义任何构造器方法,也不能定义任何实例字段. ...
- 重温CLR(九) 接口
对于多继承(multiple inheritance)的概念,许多程序员并不陌生,他是指一个类从两个或多个基类派生的能力.例如,假定TransmitData类的作用是发送数据,ReceiveData类 ...
- CLR via c#读书笔记九:接口
1.接口对一组方法签名进行了统一命名.接口还能定义事件.无参属性和有参属性(C#的索引器). 2.c#禁止接口定义任何一种静态成员. 3.C#编译器要求将实现接口的方法标记为public.CLR要求将 ...
- CLR via C#深解笔记六 - 泛型
面向对象编程一个好处就是“代码重用”,极大提高了开发效率.如是,可以派生出一个类,让它继承基类的所有能力,派生类只需要重写虚方法,或添加一些新的方法,就可以定制派生类的行为,使之满足开发人员的需求. ...
- [CLR via C#]12. 泛型
泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算法,比如排序.搜索.交换等.但是定义算法的开 ...
- 由浅入深学习.NET CLR 系列:目录
经过对Android的一阵折腾,些许熟悉了一些Java的东东,又开始转战.NET.我觉得学习最好和工作不要相离太远,才会更加随笔随意,索性整理一些比较系统的.NET的基础知识学习学习.一提起学习.NE ...
- CLR总览
Contents 第1章CLR的执行模型... 4 1.1将源代码编译成托管代码模块... 4 1.2 将托管模块合并成程序集... 6 1.3加载公共语言运行时... 7 1.4执行程序集的代码.. ...
随机推荐
- [计算几何+图论]doge
题意 在平面直角坐标系上,你有一只doge在原点处.doge被绳子拴住了,绳子不会打结,没有弹性(但很柔软),并且长度为L.平面上有一些目标,因此你的doge会按照顺序去捡起它们,但是doge只能走直 ...
- LeetCode题目总结-滑窗法
LeetCode题目总结-滑动窗口法 滑动窗口法:此方法首先建立一个长度为零的窗口,把右侧窗口向右移动,当新的元素与原来窗口中的元素不重复时,把新的元素加入其中,并更新窗口长度:当新的元素与原集合中的 ...
- C语言博客作业7
本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业链接 我在这个课程的目标是 熟练运用switch语句 这个作业在那个具体方面帮助我实现目标 完成pta作业 参考文献 文章 ...
- docker相关----解决tomcat容器启动成功,无法访问的问题
使用docker安装了tomcat镜像,默认为latest最新的(8.5.50版本),依据tomcat镜像创建容器并同时做了端口映射 命令为:docker run --name tomcat01 -d ...
- 根据范围爬TMS规则瓦片
因为需要简单写了一个下载地图的爬虫,代码如下: #coding=utf-8 import urllib.request import os import socket import zlib impo ...
- Arduino系列之LCD1602模块使用方法(一)
下面我将简单介绍LCD1602模块的使用方法: 1602液晶显示器(1602 Liquid Crystal Display,此后简称1602 LCD)是一种常见的字符液晶显示器,因其能显示16*2个字 ...
- FFMPEG学习----解码视频
基础概念 我们平时看到的视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的容器格式规定了其中音视频数据的组织方式(也包括其他 ...
- Go语言标准库之net/http
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现. HTTP协议 超文本传输协 ...
- HDU4192 Guess the Numbers(表达式计算、栈)
题意: 给你一个带括号.加减.乘的表达式,和n个数$(n\leq 5)$,问你带入这几个数可不可能等于n 思路: 先处理表达式:先将中缀式转化为逆波兰表达式 转换过程需要用到栈,具体过程如下:1)如果 ...
- Jdk14 都要出了,Jdk9 的新特性还不了解一下?
Java 9 中最大的亮点是 Java 平台模块化的引入,以及模块化 JDK.但是 Java 9 还有很多其他新功能,这篇文字会将重点介绍开发人员特别感兴趣的几种功能. 这篇文章也是 Java 新特性 ...