C#接口和泛型类
1.定义:
定义为一个约束,实现接口的类或者结构必须遵守该约定。借口是类之间交互的一个协议。定义了类之间的交互标准。
接口是类之间相互交互的一个抽象,把类之间需要交互的内容抽象出来定义成接口。
接口只包含成员定义,不包含成员的实现。接口不会继承自任何的 System.Object 派生类型。接口仅仅是一个包含着一组虚方法的抽象类型
成员的实现需要在继承的类或者结构中实现接口的成员包括静
态方法、索引器、常数、事件以及静态构造器。不能实例化一个接口
.NET 框架中的接口
(1) IComparable 接口
IComparable 接口定义通用的比较方法。由类型使用的 IComparable 接口提供了一种比较多个对象的标准方式。如果一个类要实现与其它对象的比较,则必须实现 IComparable 接口
(2) IEnumerable 接口
IEnumerable 接口公开枚举数,该枚举数支持在集合上进行简单迭代。
IEnumerable 接口可由支持迭代内容对象的类实现
(3) IEnumerator 接口
IEnumerator 接口支持在集合上进行简单迭代。是所有枚举数的基接口。
枚举数只允许读取集合中的数据,枚举数无法用于修改基础集合。
(4) ICollection 接口
ICollection 接口定义所有集合的大小、枚举数和同步方法。ICollection
接口是 System.Collections 命名空间中类的基接口。
(5) IDictionary 接口
IDictionary 接口是基于 ICollection 接口的更专用的接口。IDictionary 实现
是键/值对的集合,如 Hashtable 类。
(6) IList 接口
IList接口实现是可被排序且可按照索引访问其成员的值的集合,如ArrayList类
泛 型 的接 口 , 如 IComparable<T> 、
IEnumerable<T> 、 IEnumerator<T> 、 ICollection<T> 、 IDictionary<T> 和
IList<T>等。泛型接口的功能与非泛型接口的功能一样,只不过适用于更多的类
System.Collections 名称空间中的“内置”集合划分成了三种类别:
(1) 有序集合:仅仅实现 ICollection 接口的集合,在通常情况下,其数据项的
插入顺序控制着从集合中取出对象的顺序。System.Collections.Stack 和
System.Collections.Queue 类都是 ICollection 集合的典型例子
(2) 索引集合:实现 Ilist 的集合,其内容能经由从零开始的数字检索取出,就
象数组一样。System.Collections.ArrayList 类是索引集合的一个例子
(3) 键式集合:实现 IDictionary 接口的集合,其中包含了能被某些类型的键值
检索的项。IDictionary 集合的内容通常按键值方式存储,可以用枚举的方式排
序检索。
2、接口与抽象类
抽象类(Abstract Class)和接口在定义与功能上有很多相似的地方,在程序
中选择使用抽象类还是接口需要比较抽象类和接口之间的具体差别
抽象类是一种不能实例化而必须从中继承的类,抽象类可以提供实现,也可
以不提供实现。子类只能从一个抽象类继承。抽象类应主要用于关系密切的对象。
如果要设计大的功能单元或创建组件的多个版本,则使用抽象类。
接口是完全抽象的成员集合,不提供实现。类或者结构可以继承多个接口。
接口最适合为不相关的类提供通用功能。如果要设计小而简练的功能块,则使用
接口
public interface IBook
{
void ShowBook();
string GetTitle();
int GetPages();
void SetPages(int pages);
}
public class NewBook:IBook
{
public string title;
public int pages;
public string author;
public NewBook(string title, string author, int pages)
{
this.title = title;
this.author = author;
this.pages = pages;
} public void ShowBook()
{
Console.WriteLine("Title:{0}", title);
Console.WriteLine("Author:{0}", author);
Console.WriteLine("Pages:{0}", pages);
} public string GetTitle()
{
return title;
} public int GetPages()
{
return pages;
} public void SetPages(int pages)
{
this.pages = pages;
}
}
static void Main(string[] args)
{
NewBook newBook = new NewBook("C#编程", "laoshi", 500);
newBook.ShowBook();
Console.ReadKey();
}
基于 object 的容器的 C#实现如下:
public class Container
{
readonly int m_Size; //容器的容量
int m_ContainerPointer; //容器指针,指示最后一个元素的位置
object[] m_Items; //容器数组,存放数据
//无参构造器
public Container() : this(100)
{
m_ContainerPointer = -1;
m_Size = 100;
}
//有参构造器
public Container(int size)
{
m_Size = size;
m_Items = new object[m_Size];
m_ContainerPointer = -1;
} //获取容器元素个数属性
public int Count
{
get {
return m_ContainerPointer;
}
}
//容器是否为空
public bool IsEmpty
{
get {
return (m_ContainerPointer == -1);
}
}
//容器是否已满
public bool IsFull
{
get {
return (m_ContainerPointer == m_Size - 1);
}
}
//在容器的尾部插入一个元素
public void Insert(object item)
{
if (IsFull)
{
Console.WriteLine("Container is full");
return;
}
else if (IsEmpty)
{
m_Items[++m_ContainerPointer] = item;
}
else {
m_Items[++m_ContainerPointer] = item;
}
}
//从容器的尾部删除一个元素
public object Delete()
{
if (m_ContainerPointer >= 0)
{
return m_Items[m_ContainerPointer--];
}
return null;
}
}
1.存在性能问题 2.类型安全 3.工作效率
2、泛型的概念
通过泛型可以定义类型安全的并且对性能或工作效率无损害的类
public class Container<T>
{
readonly int m_Size; //容器的容量
int m_ContainerPointer; //容器指针,指示最后一个元素的位置
T[] m_Items; //容器数组,存放数据
//构造器
public Container() : this(100)
{
m_ContainerPointer = -1;
m_Size = 100;
}
//构造器
public Container(int size)
{
m_Size = size;
m_Items = new T[m_Size];
m_ContainerPointer = -1;
}
//获取容器元素个数属性
public int Count
{
get {
return m_ContainerPointer;
}
}
//容器是否为空
public bool IsEmpty
{
get {
return (m_ContainerPointer == -1);
}
}
//容器是否已满
public bool IsFull
{
get {
return (m_ContainerPointer == m_Size - 1);
}
}
//在容器的尾部插入一个元素
public void Inset(T item)
{
if (IsFull)
{
Console.WriteLine("Container is full!");
return;
}
else if (IsEmpty)
{
m_Items[++m_ContainerPointer] = item;
}
else {
m_Items[++m_ContainerPointer] = item;
}
}
//从容器的尾部删除一个元素
public object Delete()
{
if (m_ContainerPointer >= 0)
{
return m_Items[m_ContainerPointer--];
}
return null;
} }
C#接口和泛型类的更多相关文章
- Java反射--基于ParameterizedType实现泛型类,参数化类型
一.引子: 项目中使用Gson的反序列化将json转化成具体的对象,具体方法是: package com.google.gson;下的反序列化方法 public <T> T fromJso ...
- java成神之——接口,泛型,类
接口 接口定义 默认方法 函数式接口 泛型 泛型类 泛型类继承 类型限定 泛型方法 泛型接口 类 构造函数 类的继承 抽象类 instanceof运算符 内部类 equals 结语 接口 接口定义 j ...
- Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例
一.引入 1.泛型是什么 首先告诉大家ArrayList就是泛型.那ArrayList能完成哪些想不到的功能呢?先看看下面这段代码: [java] view plain copy ArrayList& ...
- [原译]实现IEnumerable接口&理解yield关键字
原文:[原译]实现IEnumerable接口&理解yield关键字 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享.请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢 ...
- .net学习之泛型、程序集和反射
一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> ...
- 泛型类型的协变(covariant)和逆变
官网:http://msdn.microsoft.com/zh-cn/library/dd799517.aspx 原文链接:http://book.51cto.com/art/201112/30857 ...
- C#泛型(C#_编程指南)CSDN学习整理笔记
1.1. 泛型概述 2.0版C#语言和公共语言运行时(CLR)中增加了泛型.泛型将类型参数的概念引入.NETFramework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定 ...
- 转载yield关键字理解
实现IEnumerable接口及理解yield关键字 [摘要]本文介绍实现IEnumerable接口及理解yield关键字,并讨论IEnumerable接口如何使得foreach语句可以使用. 本 ...
- C# - 类型
C#是一门使用OOP技术的编程语言(Object Oriented Programming 面向对象编程)面向对象最重要的特性就是接口.继承.多态 C#中所有的事物都可以看做是一个对象 对象由类型来创 ...
随机推荐
- UVA1660 电视网络 Cable TV Network
题目地址:UVA1660 电视网络 Cable TV Network 枚举两个不直接连通的点 \(S\) 和 \(T\) ,求在剩余的 \(n-2\) 个节点中最少去掉多少个可以使 \(S\) 和 \ ...
- 20145215《网络对抗》Exp4 恶意代码分析
20145215<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...
- cosmic_download-AsyncPool待修正
# !/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/11/16 10:02 AM # @Author : cxa # @File ...
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- JUnit3 和 JUnit4的区别
JUnit3 和 JUnit4的区别 1.JUnit 4使用org.junit.*包而JUnit 3.8使用的是junit.Framework.*;为了向后兼容,JUnit4发行版中加入了这两种包. ...
- Windows系统下安装dig命令
dig 是一个 Linux 下用来 DNS 查询信息的工具,全称是Domain Information Groper,与 nslookup 类似,但比 nslookup 功能更强大.Windows 下 ...
- Centos 6 安装FreeSWITCH
为了安装FreeSWITCH ,我选择的Linux是CentOS,目前最新的Centos版本是6.具体安装CentOS的是步骤详见网上的其它资料,本节的主要目的是为了记录FreeSWITCH的安装过程 ...
- Ex 7_17 考虑如下的网络(其中数字为对应边的容量)...第十三次作业
(a) 利用ford-fulkerson算法即可求出最大流和最小分割. (b) 剩余网络为 由S可达的顶点为A.B.可达T的顶点为C. (c) 瓶颈边有e(A,C),e(B,C). (d) 下图中不包 ...
- Jmeter下载安装配置及使用(windows)
1 前言 仅作为记录使用. 2 步骤 2.1 下载地址:http://jmeter.apache.org/download_jmeter.cgi 2.2 选择binary版本即可:apache-jme ...
- 28)django-form+ajax实现验证
form+ajax实现验证 #obj.errors返回的是ErrorDict,不是字典(虽然继承字典) #obj.errors.as_json() 返回的字符串(前端要连续反解两次) #obj.err ...