IComparable< E > Interface
Có thể so sánh 2 đối tượng của cùng loại dữ liệu nếu loại dữ liệu đó thực thi generic interface
IComparable<T > (of namespace System).
Khi thực thi giao diện IComparable< T > các đối tượng Icomparable có thể dùng với phương thức sort và search của các lớp trong System.Collections.Generic.
Các loại dữ liệu thực thi IComparable< T > phải khai báo method CompareTo để so sánh các đối tượng.
Ví dụ: nếu có 2 số nguyên int1 và int2, có thể so sánh chúng với biểu thức
Why Use Constraints
Why Use Constraints
Tuy các đối tượng IComparable có thể so sánh được
nhưng mặc định các đối tượng này không thể dùng trong mã generic vì không phải tất cả các loại dữ liệu đều thực thi giao diện IComparable< T >
Compiler phải bảo đảm được là toán tử hay method đang sử dụng đều được hổ trợ bởi đối số loại (type đang sử dụng đều được hổ trợ bởi đối số loại (type argument) .
Việc bảo đảm này sẽ thực hiện được nếu áp dụng 1 hay nhiều constraint vào các định nghĩa generic của hay nhiều constraint vào các định nghĩa generic của lớp, method, interface…
using System;
using System.Collections.Generic; using System.Text;
namespace Constraints { public interface IShape{
double Area { get; } }
public class Circle : IShape
{ public Circle( double radius ) { this.radius = radius; } public double Area
{ get { return Math.Pi*radius*radius; } } private double radius;
}
public class Rect : IShape
{ public Rect( double width, double height ) { this.width = width;
this.height = height; } public double Area {
ExampleExample Example
public class Shapes<T> where T : IShape {
public double TotalArea{ get
{ double acc = 0;
foreach (T shape in shapes) { acc += shape.Area; }
return acc; }
}
public void Add(T shape)
{ shapes.Add(shape); }
private List<T> shapes = new List<T>(); }
public class EntryPoint { static void Main(){
{ Shapes<IShape> shapes = new
Shapes<IShape>(); shapes.Add(new Circle(2)); shapes.Add(new Rect(3, 5)); Example Example Kind of c onstrate: whe re T : <inte rface name>