泛型约束:接口约束、new()构造函数约束、组合约束(即多种约束合并)
泛型 接口约束:
using System; namespace ConsoleApp1
{ /*
*
* 接口约束:where T:interfaceName
* T是类型形参的名称,interfaceName是接口名称,
* 接口约束是 指定某个类型实参必须实现的接口。
* 它的两个主要的功能和基类约束一样,允许开发人员在泛型类中使用接口中的成员;确保只能使用实现了特定接口的类型实参。
* 也就是说,对任何给定的接口约束,类型实参必须是接口本身或者是实现了该接口的类。
*
*/ class Program
{
static void Main(string[] args)
{
Console.WriteLine(Compare<int>.CompareData(, ));//
}
} /// <summary>
/// 接口约束,T的类型用IComparable这个接口来约束
/// 也就是说T的类型就是IComparable接口,用T可以调用它里面的任何方法,只要你愿意,这也就实现了接口约束的目的,即你要使用我这个接口,就必须按照我的规定来!
/// </summary>
/// <typeparam name="T"></typeparam>
public class Compare<T> where T : IComparable
{
// 定义一个方法,返回值类型为 T , 其两个形参也是T类型的
// 方法的功能:返回较大值
public static T CompareData(T n1,T n2)
{
// 调用IComparable接口中方法CompareTo(),这个方法的返回值类型为int
return n1.CompareTo(n2) > ? n1 : n2; //先不考虑两值相等的时候
}
}
}
普通 单例模式:
class Program
{
static void Main(string[] args)
{
//使用单例:类名.静态方法() <----获取到实例对象,然后再用对象调用它里面的其他方法即可
var str = Singleton.getInstance().Outresult("我是输出内容....");
Console.WriteLine(str);
}
} /// <summary>
/// 单例模式-----即一个函数只允许有一个实例对象!
/// </summary>
public class Singleton
{
// 首先定义一个Singleton类型的对象(必须静态的,不然调用它还要实例化,相悖了....),intance就是Singleton类的唯一实例对象
public static Singleton instance; // 一个获取实例对象的方法
public static Singleton getInstance()
{
// 只有当Singleton类型的对象不存在时(即本类的实例对象),才去创建这样一个对象!
if (instance == null)
{
instance = new Singleton();
} return instance;
} // 本类中一个输出方法(测试用的)
public string Outresult(string str)
{
return str;
}
}
上面用到的是类中一个方法来获取类的唯一实例对象
那完全也可以用属性的访问器来初始化一个类的对象啊,如下:
public class Singleton
{
public static Singleton instance; // 用属性的get访问器 生成单例的对象
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
} }
//其他输出方法......
}
调用的话:var str = Singleton.Instance.Outresult("我是输出内容....");
综上:两种方式实现单例
泛型 new()约束:父类是一个单例类
using System; namespace ConsoleApp1
{ /*
*
* new()构造函数约束: where T: new()
* 它允许开发人员实例化一个泛型类型的对象。
* new()约束要求类型实参必须提供一个无参数的公有构造函数。
* 使用new()约束时,可以通过调用该无参构造器来创建对象。
*
* 注意:
* 1. new()在与其他约束一起使用时,必须放在约束列表的末端
* 2. 仅允许使用无参构造器构造一个对象,即使同时存在其他的构造器也是如此。即不允许给类型形参的构造器传递实参。
* 3. 不可以同时使用new()约束和值类型约束。因为值类型都是隐式的提供一个无参公共构造器。就如同定义接口时指定访问类型为public一样,编译器会报错,因为接口一定是public的!!!
*
*/ class Program
{
static void Main(string[] args)
{
Console.WriteLine(Person.Instance.getPerson()); Console.WriteLine(Student.Instance.getStudent()); Console.WriteLine(Person.Instance.Outresult()); Console.ReadKey();
}
} /// <summary>
/// 单例模式-----即一个函数只允许有一个实例对象!
/// </summary>
public class Singleton<T> where T : new()
{
private static T instance; // 用属性的get访问器 生成单例的对象
public static T Instance
{
get
{
if (instance == null)
{
// 这里创建的不再是一个Singleton对象,而是T对象
instance = new T();
// 这样写会报错:变量类型 T 没有new()约束,因此无法创建该类型的实例
//解决:类上面写new()的约束......
}
return instance;
}
} // 本类中一个输出方法(测试用的)
public string Outresult()
{
return "this method in Singleton";
}
} /*
* 对于继承Singleton的类,必须要有一个无参构造器,因为他有new()约束!!!
*
*/ // Person类继承Singleton类,就必须指定T的类型,这里指定为Person....
public class Person : Singleton<Person>
{
public string getPerson()
{
return "this method in Person class";
}
} public class Student : Singleton<Student>
{
public string getStudent()
{
return "this method in Student";
}
}
}
组合约束:
/*
* 五种约束:
*
* where T:struct 值类型约束----类型参数必须为值类型
*
* where T:class 引用类型约束:适用于类、接口、委托、数组等----类型参数必须为引用类型
*
* where T:new() new()约束-----类型参数必须有一个公有的无参构造器
*
* where T:<base class name> 基类约束-----类型参数必须是指定的基类或是派生自指定的基类
*
* where T:<interface> 接口约束-----类型参数必须是指定接口或实现指定的接口,可以指定多个接口约束,约束接口也可以是泛型的
*
*
* 组合约束:用的不多,基本都是别人封装好的,我们拿来直接调用即可
* 同一个类型形参可以使用多个约束。逗号隔开
* 在约束列表中,第一个必须是引用类型约束或者值类型约束,或者是基类约束,然后才是接口约束,最后才是new()约束
* 指定引用类型约束或值类型约束的同时也指定基类约束是非法的
*
* 例如:
* class Test<T> where T : Myclass, Interface, new(){......}
* 替换T的类型实参必须是继承Myclass类,实现Interface接口,且拥有一个无参构造器
*
* 在使用两个或多个类型形参时,也可以使用多条where子句分别为它们指定约束
*
*/
泛型约束:接口约束、new()构造函数约束、组合约束(即多种约束合并)的更多相关文章
- WPF 异常其他信息: “对类型“BaseControl.KImgButton”的构造函数执行符合指定的绑定约束的调用时引发了异常。”,行号为“38”,行位置为“22”。
引发的异常:“System.Windows.Markup.XamlParseException”(位于 PresentationFramework.dll 中) 其他信息: “对类型“BaseCont ...
- CDM中,创建一个或多个组合属性的唯一约束
除主键外,有时还需要创建一个或多个组合字段的唯一约束,方法如下: 双击打开实体,在idntifier标签页中可看到默认主键的唯一约束,在其下方添加一条记录,然后双击该记录,打开约束设置窗口 在该窗口的 ...
- 2019-4-12-WPF-类型的构造函数执行符合指定的绑定约束的调用时引发了异常
title author date CreateTime categories WPF 类型的构造函数执行符合指定的绑定约束的调用时引发了异常 lindexi 2019-04-12 08:52:35 ...
- MySQL8.0数据库出现的问题——外码创建方式、外键约束两个引用列不兼容问题、check约束问题、用触发器代替check约束、关键字DELIMITER、删除添加索引、删除添加外键约束、和一些数据库方面的操作
一.首先先说一下我们都需要建立那些表 mysql> CREATE TABLE IF NOT EXISTS `student`( -> `sno` CHAR(8) NOT NULL, -&g ...
- 实现泛型IEnumerable接口
用C#实现一个类的IEnumerable接口时有两种方法:1)实现非泛型IEnumerable接口:2)实现泛型IEnumerable(T)接口.如果采用方法1,当集合元素T是值类型时,将涉及到巨多的 ...
- C# 泛型 new{ }??? //加new 和不加new 有什么不同? new() 约束
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 对类型“ImgProWPF.MainWindow”的构造函数执行符合指定的绑定约束的调用时引发了异常。
这个问题的出现是在于我写的一句话 Icon = BitImg("Image/Icon.png") 其原因是Image/Icon.png路径不在执行的exe文件的目录下 将Image ...
- 对类型“DevExpress.Xpf.Grid.GridControl”的构造函数执行符合指定的绑定约束的调用时引发了异常。
用VS2012 修改别人的WPF代码时碰到这个问题,百度下有人遇到相同问题,不过版本不同,先试下再说. 解决方法:安装Netframework4.5的补丁 地址:http://support.micr ...
- TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts
1,面向对象的特性一:类,继承,见上一篇博客: 2,面向对象的特性二: 泛型(generic):参数化的类型,一般用来限制集合的内容:指定只能放某个类型的元素 如下图中的尖括号中的Person,就代表 ...
随机推荐
- 网络1911、1912 C语言第0次作业批改总结
网络1911.1912 C语言第0次作业批改总结 题目:C博客作业00--我的第一篇博客 一.评分规则 总分10分,每个问题都务必回答,分值都在问题后面 抄袭 - 0分 博客作业格式不规范,没有用Ma ...
- YouTube 网站的架构演进——阅读心得
基础平台 Apache Python Linux(SuSe) MySQL psyco,一个动态的Python到C的编译器 lighttpd代替Apache做视频播放 状态 支持每天超过5亿的视频点击量 ...
- php判断为空就插入,判断不为空就更新
if ($_GET['tplname']!==null) { if ($userinfo[0] == ''){$exec="INSERT INTO cblej_company_pc_temp ...
- Qt编写自定义控件27-颜色按钮面板
一.前言 颜色按钮面板主要用在提供一个颜色按钮面板,用户单击某个按钮,然后拿到对应的颜色值,用户可以预先设定常用的颜色集合,传入到控件中,自动生成面板颜色集合按钮,每当滑过按钮的时候,按钮边缘高亮提示 ...
- 【401】Python 求合数的所有质数因子
对于这样的一个题目来说,出看来,可能会想到判断是否为质数,但其实并不需要. 只要按照从2开始遍历,只要遇到可以整除的就是想要的质数,理由是,如果遇到合数的话,那么在此之前一定会遇到这个合数的质因子,因 ...
- 从字节跳动离职后,拿到探探、趣头条、爱奇艺、小红书、15家公司的 offer【转】
前言 博主目前从事Android开发3年,前两年一直在抖音工作.我这篇文章并不是简单的描述一些面试中的题,或者总结一些Android的知识,而是想记录我整个的想法和准备的过程,以及一些心得体会,让大家 ...
- 驱动备份还原命令——驅動備份還原命令——Driver Backup/Restore
以管理員身份啓動命令提示符,輸入以下命令: 1.驅動備份(备份Backup)命令: Dism /online /export-driver /destionation:D:\DriverBackup ...
- 工具 --- Git使用
创建远程仓库 Github 首相在GitHub网站创建一个仓库:右上角加号➕,选择new repository 然后创建编辑仓库:名称.说明.是否公开.语言.分支风格等信息.然后创建. 复制仓库地址 ...
- 鸟哥私房菜基础篇:程序管理与 SELinux 初探习题
猫宁!!! 参考:http://cn.linux.vbird.org/linux_basic/0440processcontrol.php 1-简单说明什么是程序 (program) 而什么是程序 ( ...
- 一步步分析Java深拷贝的两种方式-clone和序列化
今天遇到一道面试题,询问深拷贝的两种方法.主要就是clone方法和序列化方法.今天就来分析一下这两种方式如何实现深拷贝.如果想跳过解析的朋友,直奔"重点来了!"寻找答案. clon ...