Явная реализация стандартного интерфейса.NET
Мне нужно явно реализовать стандартные интерфейсы C#, такие как (IComparable
, IComparer
, IEquatable
, IEnumerable
, IEnumerator
). Я делаю это правильно?
class Lemon : IComparable
{
public String name { get; set; }
public int id { get; set; }
public Lemon (String name, int id)
{
this.name = name;
this.id = id;
}
int IComparable.CompareTo(object obj)
{
Lemon other = (Lemon)obj;
if (this.id > other.id)
return 1;
else if (this.id < other.id)
return -1;
else return 0;
}
public void diamond ()
{
Console.WriteLine();
}
public override string ToString()
{
return this.name + " " + this.id;
}
}
а теперь главное:
static void Main(string[] args)
{
List<IComparable> icL = new List<IComparable>();
IComparable temp = new Lemon("Git", 99);
icL.Add(temp);
icL.Add(new Lemon("Green", 9));
icL.Add(new Lemon("Don", 7));
icL.Add(new Lemon("Simon", 12));
icL.Sort();
foreach (IComparable itm in icL)
{
Console.WriteLine(itm.ToString());
}
Console.WriteLine("----------");
}
Так что ты думаешь?
И еще одна проблема - как я могу получить доступ к методу diamond, когда я перебираю коллекцию?
1 ответ
На это нет однозначного ответа; это, однако, полезно для типов, которые сопоставимы для реализации IComparable<T>
, Обычно это случай совместного использования одной реализации:
int IComparable<Lemon>.CompareTo(Lemon obj) {
return CompareTo(obj);
}
int IComparable.CompareTo(object obj) {
return CompareTo(obj as Lemon);
}
private int CompareTo(Lemon obj) {
return obj == null ? -1 : (this.id - obj.id);
}
Обратите внимание, что реализация IEnumerable
/ IEnumerator
очень отличается, и обычно делается путем простого возврата итератора инкапсулированного объекта или путем написания блока итератора; очень редко вручную написать итератор с нуля.
Если вы реализуете IEquatable<T>
, вы должны убедиться, что object.Equals
, object.GetHashCode
а также IEquatable<T>.Equals
у всех есть соответствующие реализации; для 2 Equals
методы, это снова может быть сделано с помощью одного метода, который вы вызываете из обоих.
Ваш список может быть List<Lemon>
; это все равно должно сортироваться правильно. Это также облегчит доступ к таким методам, как diamond()
:
var icL = new List<Lemon>();
// ...
foreach (var item in icL) {
item.diamond();
Console.WriteLine(item.ToString());
}