泛型学习(可空类型,排序,定义泛型类,变体(协变与抗变))


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 可空类型
{
    public class Vector
    {
        public Double? 半径 = null, 角度 = null;
        public Double? 弧度
        { get { return (角度 * Math.PI / 180.0); } }
        public Vector(Double? 半径参, Double? 角度参)
        {
            if (半径参 < 0) { 半径参 = -半径参; 角度参 += 180; }
            角度参 %= 360;
            半径 = 半径参;
            角度 = 角度参;
        }
        public static Vector operator +(Vector 值1, Vector 值2)
        {
            try
            {
                double 新X = 值1.半径.Value * Math.Sin(值1.角度.Value) + 值2.半径.Value * Math.Sin(值2.角度.Value);
                double 新Y = 值1.半径.Value * Math.Cos(值1.角度.Value) + 值2.半径.Value * Math.Cos(值2.角度.Value);
                double 新半径 = Math.Sqrt(新X * 新X + 新Y * 新Y);
                double 新角度 = Math.Atan2(新X, 新Y) * 180.0 / Math.PI;
                return new Vector(新半径, 新角度);
            }
            catch { return new Vector(null, null); }
        }
        public static Vector operator -(Vector 值1)
        {
            return new Vector(-值1.半径, 值1.角度);
        }
        public static Vector operator -(Vector 值1, Vector 值2)
        {
            return 值1 + (-值2);
        }
        public override string ToString()
        {
            string 半径值 = 半径.HasValue ? 半径.ToString() : "null";
            string 角度值 = 角度.HasValue ? 角度.ToString() : "null";
            return string.Format("({0},{1})", 半径值, 角度值);
        }
    }
    
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 可空类型
{
    class Program
    {
        static void Main(string[] args)
        {
            Vector 值1 = 获取矢量("Vector1");
            Vector 值2 = 获取矢量("Vector2");
            Console.WriteLine("{0} + {1} = {2}", 值1, 值2, 值1 + 值2);
            Console.WriteLine("{0} - {1} = {2}", 值1, 值2, 值1 - 值2);

            Console.ReadLine();
        }
        static Vector 获取矢量(string 名称)
        {
            Console.WriteLine("输入幅度{0}", 名称);
            double? 半径 = 获取可空值();
            Console.WriteLine("输入角(度){0}", 名称);
            double? 角度 = 获取可空值();
            return new Vector(半径, 角度);
        }

        static double? 获取可空值() 
        {
            double? 结果;
            string 用户输入 = Console.ReadLine();
            try { 结果 = double.Parse(用户输入); }
            catch { 结果 = null; }
            return 结果;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 可空类型
{
    public class 泛型排序 : List<Vector>
    {
        public 泛型排序(){}
        public 泛型排序(IEnumerable<Vector> 最初的项目)
        {
            foreach (Vector 元素 in 最初的项目) Add(元素);
        }
        public string 总和()
        {
            StringBuilder 输出 = new StringBuilder();
            Vector 当前点 = new Vector(0.0, 0.0);
            输出.Append("起源");
            foreach (Vector 元素 in this)
            {
                输出.AppendFormat(" + {0}", 元素);
                当前点 += 元素;
            }
            输出.AppendFormat(" = {0}", 当前点);
            return 输出.ToString();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 可空类型
{
    public static class 矢量代表
    {
        public static int 比较(Vector x, Vector y)
        {
            if (x.半径 > y.半径) return 1;
            else if (x.半径 < y.半径) return -1;
            return 0;
        }
        public static bool 右上象限(Vector 目标)
        {
            if (目标.角度 >= 0.0 && 目标.角度 <= 90.0) return true; else return false;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 可空类型
{
    class Program
    {
        static void Main(string[] args)
        {
            泛型排序 路线 = new 泛型排序();
            路线.Add(new Vector(2.0, 90.0));
            路线.Add(new Vector(1.0, 180.0));
            路线.Add(new Vector(0.5, 45.0));
            路线.Add(new Vector(2.5, 315.0));
            Console.WriteLine(路线.总和());
            //Comparison<Vector> 排序 = new Comparison<Vector>(矢量代表.比较);
            //路线.Sort(排序);
            路线.Sort(矢量代表.比较/*隐式创建类型实例*/);
            Console.WriteLine(路线.总和());

            Predicate<Vector> 搜索 = new Predicate<Vector>(矢量代表.右上象限);
            泛型排序 右上象限路线 = new 泛型排序(路线.FindAll(搜索));
            Console.WriteLine(右上象限路线.总和());

            Console.ReadLine();
        }
    }
}

修改以前动物例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 集合示例
{
    public class 鸡 : 动物
    {
        public void 下蛋() { Console.WriteLine("{0}一个鸡蛋.", 名称); }
        public override void 马可的噪声()
        { Console.WriteLine("{0}写着'咕咕'", 名称); }
        public 鸡(string 新名称) : base(新名称) { }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 集合示例
{
    public class 牛 : 动物
    {
        public void 牛奶() { Console.WriteLine("{0}已经挤奶.", 名称); }
        public override void 马可的噪声()
        { Console.WriteLine("{0}写着'哞哞'", 名称); }
        public 牛(string 新名称) : base(新名称) { }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 集合示例
{
    class 超牛 : 牛
    {
        public void 飞() { Console.WriteLine("{0}飞行!", 名称); }
        public 超牛(string 新名) : base(新名) { }
        public override void 马可的噪声()
        { Console.WriteLine("{0}写着'在这里,我来保存一天!'", 名称); }
    }
}

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 集合示例
{
    class 农场<T> : IEnumerable<T> where T : 动物/*被约束为基类或继承类型*/
    {
        private List<T> 集动物 = new List<T>();
        public List<T> 动物集 { get { return 集动物; } }
        public IEnumerator<T> GetEnumerator()
        { return 集动物.GetEnumerator(); }
        IEnumerator IEnumerable.GetEnumerator() { return 集动物.GetEnumerator(); }
        public void 马可的声音() { foreach (T 动物 in 集动物)动物.马可的噪声(); }
        public void 喂动物() { foreach (T 动物 in 集动物)动物.饲料(); }
        public 农场<牛> 获取奶牛()
        {
            农场<牛> 农场牛 = new 农场<牛>();
            foreach (T 动物 in 集动物)
                if (动物 is 牛) 农场牛.集动物.Add(动物 as 牛);
            return 农场牛;
        }

        public static implicit operator List<动物>(农场<T> 农场动物)
        {
            List<动物> 结果 = new List<动物>();
            foreach (T 元素 in 农场动物) 结果.Add(元素);
            return 结果;/*隐式的转换运算符*/
        }
        public static 农场<T> operator +(农场<T> 农场动物1, List<T> 农场动物2)
        {
            农场<T> 结果 = new 农场<T>();
            foreach (T 元素 in 农场动物1) 结果.动物集.Add(元素);
            foreach (T 元素 in 农场动物2) if (!结果.动物集.Contains(元素)) 结果.动物集.Add(元素);
            return 结果;/*泛型运算符*/
        }
        public static 农场<T> operator +(List<T> 农场动物1, 农场<T> 农场动物2)
        {
            return 农场动物1 + 农场动物2;
        }
        //public static implicit operator 农场<动物>(农场<T> 农场动物)
        //{
        //    农场<动物> 结果 = new 农场<动物>();
        //    foreach (T 元素 in 农场动物) 结果.动物集.Add(元素);
        //    return 结果;/*转换运算符:public static 农场<T> operator +(农场<T> 农场动物1, 农场<T> 农场动物2)*/
        //}
        interface 泛型接口<T> where T : 动物
        {
            bool 学尝试(T 农场动物1, T 农场动物2);
            T 获取缺省 { get; }
        }
        public T 泛型方法<T>() { return default(T); }
        public 农场<U> 动物种<U>() where U : T
        {
            农场<U> 农场种 = new 农场<U>();
            foreach (T 元素 in 集动物) if (元素 is U) 农场种.动物集.Add(元素 as U);
            return 农场种;
        }
    }
}

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace 集合示例
{
    class Program
    {
        public struct 泛型结构<T1, T2>
        { public T1 项1; public T2 项2;}
        public delegate T1 泛型委托<T1, T2>(T2 p1, T2 p2) where T1 : T2;
        static void 列表动物(IEnumerable<动物> 动物合)
        {
            foreach (动物 元素 in 动物合) Console.WriteLine(元素.ToString() + "协变示例->"+ 元素.称名);
        }
        public interface 协变接口<out T>{ }/*继承类值写到基类变量,用作方法的返回值或属性读取get*/
        public interface 抗变接口<in T> { }/*基类值写到继承类变量,用作方法参数,不能用作返回类型*/
        
        static void Main(string[] args)
        {
            农场<动物> 农场动物 = new 农场<动物>();
            农场动物.动物集.Add(new 牛("捷克"));
            农场动物.动物集.Add(new 鸡("伊罗"));
            农场动物.动物集.Add(new 鸡("肯"));
            农场动物.动物集.Add(new 超牛("肯尼亚"));
            农场动物.马可的声音();
            农场<牛> 奶牛场 = 农场动物.获取奶牛();
            奶牛场.喂动物();
            foreach (牛 元素 in 奶牛场)
                if (元素 is 超牛) (元素 as 超牛).飞();
            /*定义泛型转换符和运算符*/
            奶牛场.动物集.Add(new 牛("克捷"));
            农场<动物> 新农场动物 = 农场动物 + 奶牛场;

            农场<牛> 场奶牛 = 农场动物.动物种<牛>();
            农场<鸡> 场鸡 = 农场动物.动物种<鸡>();
            
            List<牛> 牛集 = new List<牛>();
            牛集.Add(new 牛("牛牛"));
            牛集.Add(new 超牛("犇"));
            列表动物(牛集);
            牛集.Sort(new 动物名称的长度比较器());
            
            Console.ReadKey();
        }
    }
}

以前的 动物 类文件中添加:
    public class 动物名称的长度比较器 : IComparer<动物>
    {
        public int Compare(动物 X, 动物 Y) 
        {
            return X.称名.Length.CompareTo(Y.称名.Length);
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值