显式标准.NET接口实现

时间:2014-10-14 18:16:49

标签: c# .net oop interface explicit-interface

我需要明确地实现标准c#接口,例如(IComparableIComparerIEquatableIEnumerableIEnumerator)。我做得对吗?

 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("----------");

        }

那你觉得怎么样?

另一个问题是我在迭代集合时如何访问方法菱形?

1 个答案:

答案 0 :(得分: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.Equalsobject.GetHashCodeIEquatable<T>.Equals都具有匹配的实施方式;对于2个Equals方法,可以通过使用从两个方法调用的单个方法再次完成此操作。

您的列表可能是List<Lemon>;它应该仍然正确排序。这样也可以轻松访问diamond()

等方法
var icL = new List<Lemon>();
// ...
foreach (var item in icL) {
    item.diamond();                
    Console.WriteLine(item.ToString());
}