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


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

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

    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爱好者,正宗测试实践者。
  • 相关阅读:
    HTTP状态码
    Binary String Matching
    三个数从小到大排序
    java控制台输入带空格的字符串
    括号配对问题
    最小生成树之Prim算法(最原始最详细入门)
    hdu 1850 Being a Good Boy in Spring Festival(尼姆博弈)
    hdu 1848 Fibonacci again and again(尼姆博弈)
    hdu 1847 Good Luck in CET-4 Everybody!(入门SG值)
    hdu 1527 取石子游戏(威佐夫博弈)
  • 原文地址:https://www.cnblogs.com/herbert/p/1744407.html
Copyright © 2020-2023  润新知