C#学习之泛型

  1. 什么泛型?

    泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

  2. 为什么要使用泛型?

    通常我们在开发的时候会碰到这样的情况:一个方法实现的功能都是一样的(比如说保存一个对象),但是我们传递的参数类型不一样而已,如果按照一般来讲都会去拷贝一份方法把传递的参数类型改成想要的类型。

    代码如下:

//学生实体类
public class Student
    {
        public string Stuno { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public string Phone { get; set; }
        public string Addr { get; set; }

    }
    
//教师实体类
public class Teacher
    {
        public string Name { get; set; }//教师姓名
        public string Department { get; set; }//所属科室
        public string Title { get; set; }//职称
        //......省略
    }

    
//学生操作接口
public interface StudentDao
    {
        public void Save(Student s);
    }
//教师操作接口
public interface TeacherDao
    {
        public void Save(Teacher t);
    }
    
//学生接口实现
 class StudentDaoImpl:StudentDao
    {
        public void Save(Student s)
        {
            ISession session = factory.OpenSession();
            ITransaction tx;
            try {
            			tx = session.BeginTransaction();
            			session.save(s);
            			tx.Commit();
            } catch (Exception e) {
            			if (tx != null) tx.Rollback();
            			throw;
            } finally 
            {
            			session.Close();
            }
        }
    }
//教师接口实现
 class TeacherDaoImpl:TeacherDao
    {
        public void Save(Teacher t)
        {
            ISession session = factory.OpenSession();
            ITransaction tx;
            try {
            			tx = session.BeginTransaction();
            			session.save(t);
            			tx.Commit();
            } catch (Exception e) {
            			if (tx != null) tx.Rollback();
            			throw;
            } finally 
            {
            			session.Close();
            }
        }
    }

上面的Save方法大部分都是一样的,除了传进来的实体参数类型不一样,对于实体的基本操作(增删改查)都可以通过泛型接口实现,不用每个实体操作接口的实现再写一遍重复的代码,这样就大大提高了编程的效率,和代码的复用率。对于上面的例子应该如何去做呢?请看我下面的代码:

//基本通用接口
public interface DaoSupport<T> 
    {

	    void save(T entity);
    }

//泛型接口实现
public class BaseDaoImpl<B>:BaseDao<B>
{
    public void Save(B b)
    {
        ISession session = factory.OpenSession();
            ITransaction tx;
            try {
            			tx = session.BeginTransaction();
            			session.save(t);
            			tx.Commit();
            } catch (Exception e) {
            			if (tx != null) tx.Rollback();
            			throw;
            } finally 
            {
            			session.Close();
            }
    }
    
}

这样的话就TeacherDao,StudentDao可以进行接口继承DaoSupport和TeacherDaoImpl,StudentDaoImp继承接口实现类DaoSupportImpl类就可以公用那些功能方法了。是不是很简单,很好用?!

//老师接口类
public Interface TeacherDao<Teacher>:DaoSupport<Teacher>
{
    ////这里可以进行教师类特有操作的定制实现
}
//老师接口实现类
public class TeacherDaoImpl<Teacher>:DaoSupportImpl<Teacher>,TeacherDao<Teacher>
{
    //这里可以进行教师类特有操作的定制实现
}

//学生接口
public interface StudentDao<Student>:DaoSupport<Student>
{
    //这里可以进行学生类特有操作的定制
}
//学生接口实现
public class StudentDaoImpl<Student>:DaoSupportImpl<Student>,StudentDao<Student>
{
    //这里可以进行学生类特有操作的定制实现
}

总结:

1.泛型类似于一个类型占位符(自己这么理解),在接口里不进行详细的声明,只是给类型占一个位置

2.在具体到某一个操作对象时把参数T换成你要操作对象的类型,那么这个操作类就是正对于该类的操作类实例。极大的提高了编程效率和代码复用。

3.DaoSupport里面所放置的方法是任何一个类型实体对象都有的操作,比如基本的增删改查,就是那些可以被公用的方法代码抽取成公共的基接口类。

4.如果在DaoSupport中实现的方法中不能满足业务需要,那么在具体实体操作类中可以定制自己特有的方法。比如:教师类中要进行多条件查询等。

时间: 2024-10-23 03:50:58

C#学习之泛型的相关文章

.net学习之泛型、程序集和反射

一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> 2.执行的时候,当JIT编译器第一次遇到MyList<int>时,将用int替换“范型版”IL代码与元数据中的T—进行泛型类型的实例化.例如 :Main函数中显示的<int> 3.什么是泛型泛型是具有占位符(类型参数)的类.方法.结构.接口 4.泛型类的继承public class F

C#学习之泛型继承和静态成员

想要理解这里有必要先将泛型类学习充分.这里讲解的是泛型类继承类的类型和静态成员. 在前面C#学习之泛型中,创建的LinkList<T>类实现了IEnumerable<T>接口. 即泛型类也可以实现泛型的接口,也可派生自一个类.泛型类也可以派生自泛型基类. public class Base<T> { } public class Derived<T>:Base<T> { } 也可以指定基类的类型,可以执行某些特定操作 public class D

Java编程思想学习(十一) 泛型

1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. 泛型能在定义类,接口和方法时将类型(类和接口)作为参数.和方法声明时的形式参数很类似,都是为了在不同的输入时重用相同的代码.不同的是形式参数输入的是值而泛型是类型. 2.为什么使用泛型 1.编译时更加强的(Stronger)类型检测java编译器对泛型代码进行强类型检

ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof

一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计思想,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中,每行代码都要用心去写,每一行代码都要力求使最简洁的 3:学习别人遇到问题是如何分析问题,解决问题的方法是什么 4:遇到新东西应该如何去学习:1:先研究要学习的东西作用是什么 ,有什么好处  2:如何使用:具体的语

关于学习C#泛型委托过程中发现的一些疑惑,大家一起讨论下

大家知道泛型委托Action,是定义一个没有返回值的委托. 例如: public Action<int, int> AddAction = (x, y) => { Console.WriteLine(x+y); }; 定义一个Action 可以在Action上F12进入可以看到源码为: public delegate void Action<T1, T2>(T1 arg1, T2 arg2); 这里发现一个问题,T1,T2是什么类型呢,在哪里定义的,我按F12并没有找到对应的

swift学习笔记-&gt;泛型

如果学过java就知道泛型是什么  比如说定义一个数组  var a : [Int] Int 就是该数组的泛型 创建一个字典也是根据泛型储存内容的 var a : Dictionary <String,String> 而泛型能解决的问题  就像字典一样  他是个不确定的键值对  你定义什么类型就能存什么类型 泛型函数 下面举个例子一个函数  要将两个参数值互换 func myswap(inout a: Int,inout b: Int) { let temp = a a = b b = tem

unity3d中设计模式的学习&lt;一&gt;:泛型单例

单例是游戏开发中比较常见的设计模式,虽然针对的功能不同,但是有一些功能还是共有的,代码也不少,如果能放在一个基类里面是最好不过了,但是单例里需要有个instance功能来返回当前对象,所以这个功能必须是static的,没办法直接继承,之前看了<面向对象的游戏开发>这本书里,使用的是泛型,于是我实验了几次 现在我们就来实现这个较为简单的单例泛型: public class Singleton<T> : MonoBehaviour where T: MonoBehaviour //因为

C#学习之泛型准备

想要把泛型搞明白,最好先弄明白下面的代码实例 本实例是建立了两个类,然后在类中可以添加任意类型的值,并且可以利用foreach语句读出 1 //第一个节点类,放在一个文件中 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 using System.Collections; 8 9 names

C#学习笔记 ----泛型

泛型的优点和缺点: 性能 类型安全 二进制代码的重用 代码的扩展 命名约定(字母T作为前缀) 创建泛型类型,如下: public class LinkedListNode<T> { public LinkedListNode(T value) { this.Value = value; } public T Value{get;private set;} public LinkedListNode<T> Next{get;internal set;} public LinkedLi