• 【读书笔记】泛型接口 和 泛型方法


    使用泛型可以定义接口,接口中的方法可以带泛型参数。

    下面是一个泛型接口的例子:

    public interface IComparable<T>
    {
    	int CompareTo(T other);
    }
    

    对于一个Person类的实现:

    public class Person : IComparable<Person>
    {
    	public int CompareTo(Person obj)
    	{
    		return this.lastname.CompareTo(other.lastname);
    	}
    }

    除了定义泛型类型之外,还可以定义泛型方法。 在泛型方法中,泛型类型用方法声明来定义。

    下面示例一个交换的泛型方法:

    void Swap<T>(ref T x, ref T y)
    {
    	T temp;
    	temp = x;
    	x = y;
    	y = temp;
    }
    

    泛型方法的调用,有两种方法:

    一, 把泛型类型赋予方法调用

    int i = 4;
    int j = 5;
    Swap<int>(ref i, ref j);
    

    或者直接像非泛型方法那样调用, 这是因为C#编译器会通过调用Swap方法来获取参数的类型。

    int i = 4;
    int j = 5;
    Swap(ref i, ref j);
    

    下面的例子使用泛型方法累加集合中所有元素。

    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.Linq;
    using System.Text;
    
    namespace GenericMethod
    {
        public class Account
        {
            private string name;
            public string Name
            {
                get
                {
                    return name;
                }            
            }
    
            private decimal balance;
            public decimal Balance
            {
                get
                {
                    return balance;
                }
            }
    
            public Account(string name, decimal balance)
            {
                this.name = name;
                this.balance = balance;
            }
        }
    
        // 传统方法 使用foreach语句迭代所有的Account对象
        public static class Algorithm
        {
            public static decimal AccumulateSimple(IEnumerable e)
            {
                decimal sum = 0;
                foreach (Account a in e)
                {
                    sum += a.Balance;
                }
                return sum;
            } 
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                List<Account> accounts = new List<Account>();
                accounts.Add(new Account("Christian", 1500));
                accounts.Add(new Account("Sharon", 2200));
                accounts.Add(new Account("Katie", 1800));
    
                decimal amount = Algorithm.AccumulateSimple(accounts);
    
                Console.WriteLine(amount.ToString());
                Console.ReadLine();
    
            }
        }
    }
    
    

    当使用上面的传统方法的时候就会有一个问题, 它只能适用于Account对象

     foreach (Account a in e)
    将这个方法扩充到对所有对象适用的时候

    // 加强版的泛型方法
        public class Account : IAccount
        {
            //...
        }
    
        public interface IAccount
        {
            decimal Balance
            {
                get;
            }
            string Name
            {
                get;
            }
        }
    
        public static class Algorithm
        {
            public static decimal AccumulateSimple<TAccount>(IEnumerable<TAccount> coll) where TAccount : IAccount
            {
                decimal sum = 0;
                foreach (TAccount a in coll)
                {
                    sum += a.Balance;
                }
                return sum;
            } 
        }
    

    调用可以采用2种方法来调用这个泛型方法了:

    decimal amount = Algorithm.Accumulate<Account>(accounts);

    或者:

    decimal amount = Algorithm.Accmulate(accounts);

    伪python爱好者,正宗测试实践者。
  • 相关阅读:
    屠呦呦团队研究新进展:青蒿中有其他抗疟成分
    lammps模拟化学反应(1)
    伪类的使用--鼠标悬浮效果
    bootstrap中模态框的使用
    idea_2018.1.5版本的激活使用
    火狐浏览器开发者版本
    使用bootstrap的相关配置
    StringBuffer类
    如何判断字符串中大写字母,小写字母和数字出现的次数??
    ssm框架结构的搭建
  • 原文地址:https://www.cnblogs.com/herbert/p/1744407.html
Copyright © 2020-2023  润新知