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);
}
}