Пример 5. Ограничение обобщенного метода
using System;
using System.Collections.Generic;
interface ITrue
{
bool isTrue();
}
class Person : ITrue
{
public string name;
public int age;
public bool isTrue()
{
return age >= 18;
}
}
static class Extension
{
public static List filtr(this List TList) where T : ITrue
{
List newTList = new List();
foreach (T tobj in TList)
if (tobj.isTrue()) newTList.Add(tobj);
return newTList;
}
}
class Program
{
static void Main()
{
List
TList = new List
{ new Person {name = "T1", age = 15}, new Person {name = "T2", age = 18},
new Person {name = "T3", age = 20}, new Person {name = "T4", age = 13} };
List
T2List = TList.filtr();
foreach (Person t in T2List)
{ Console.WriteLine(t.name + " " + t.age); }
}
}
Пример 6. Простой пример обобщенного делегата.
using System;
// Объявить обобщенный делегат.
delegate T SomeOp(T v);
class GenDelegateDemo
{
// Возвратить результат суммирования аргумента.
static int Sum(int v)
{
int result = 0;
for (int i = v; i > 0; i--)
result += i;
return result;
}
// Возвратить строку, содержащую обратное значение аргумента.
static string Reflect(string str)
{
string result = "";
foreach (char ch in str)
result = ch + result;
return result;
}
static void Main()
{
// Сконструировать делегат типа int.
SomeOp intDel = Sum;
Console.WriteLine(intDel(3));
// Сконструировать делегат типа string.
SomeOp strDel = Reflect;
Console.WriteLine(strDel("Привет"));
}
}
Пример 7. Продемонстрировать применение обобщенного интерфейса.
using System;
public interface ISeries
{
T GetNext();// возвратить следующее по порядку число
void Reset(); // генерировать ряд последовательных чисел с самого начала
void SetStart(T v); // задать начальное значение
}
// Реализовать интерфейс ISeries.
class ByTwos : ISeries
{
T start;
T val;
// Этот делегат определяет форму метода, вызываемого для генерирования
// очередного элемента в ряду последовательных значений.
public delegate T IncByTwo(T v);
// Этой ссылке на делегат будет присвоен метод,
// передаваемый конструктору класса ByTwos.
IncByTwo incr;
public ByTwos(IncByTwo incrMeth)
{
start = default(T);
val = default(T);
incr = incrMeth;
}
public T GetNext()
{
val = incr(val);
return val;
}
public void Reset()
{
val = start;
}
public void SetStart(T v)
{
start = v;
val = start;
}
}
class ThreeD
{
public int x, y, z;
public ThreeD(int a, int b, int c)
{
x = a;
y = b;
z = c;
}
}
class GenlntfDemo
{
// Определить метод увеличения на два каждого
// последующего значения типа int.
static int IntPlusTwo(int v)
{
return v + 2;
}
// Определить метод увеличения на два каждого
// последующего значения типа double.
static double DoublePlusTwo(double v)
{
return v + 2.0;
}
// Определить метод увеличения на два каждого
// последующего значения координат объекта типа ThreeD.
static ThreeD ThreeDPlusTwo(ThreeD v)
{
if (v == null) return new ThreeD(0, 0, 0);
else return new ThreeD(v.x + 2, v.y + 2, v.z + 2);
}
static void Main()
{
// Продемонстрировать генерирование
// последовательного ряда значений типа int.
ByTwos intBT = new ByTwos(IntPlusTwo);
for (int i = 0; i < 5; i++)
Console.Write(intBT.GetNext() + " ");
Console.WriteLine();
// Продемонстрировать генерирование
// последовательного ряда значений типа double.
ByTwos dblBT =
new ByTwos(DoublePlusTwo);
dblBT.SetStart(11.4);
for (int i = 0; i < 5; i++)
Console.Write(dblBT.GetNext() + " ");
Console.WriteLine();
// Продемонстрировать генерирование последовательного ряда
// значений координат объекта типа ThreeD.
ByTwos ThrDBT = new ByTwos(ThreeDPlusTwo);
ThreeD coord;
for (int i = 0; i < 5; i++)
{
coord = ThrDBT.GetNext();
Console.Write(coord.x + "," +
coord.y + "," +
coord.z + " ");
}
Console.WriteLine();
}
}
Достарыңызбен бөлісу: |