【问题标题】:Explicit standard .NET interface implementation [closed]显式标准.NET接口实现[关闭]
【发布时间】:2014-12-09 15:30:40
【问题描述】:

我需要显式地实现标准 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("----------");

        }

那你怎么看?

另一个问题是当我遍历集合时如何访问方法 diamond ?

【问题讨论】:

  • 实施 IComparable 与 IComparable 相对,可能值得一看。您的 CompareTo 方法将采用 Lemon 类型的参数,您可以简单地返回 id.CompareTo(other.Id)
  • 使实现IEquatable 的类型可变是非常危险的。您的代码还有其他一些非常奇特的事情;如果你告诉我们你是什么trying to accomplish 会有所帮助,而不仅仅是你在做什么,因为你在做什么毫无意义。
  • @DourHighArch 这只是一个例子,我正在制作其他项目,其要求之一是显式实现标准 .NET 接口之一

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


【解决方案1】:

对此没有单一的答案;但是,它对于可与实现IComparable&lt;T&gt; 相媲美的类型很有用。这通常是共享单个实现的情况:

    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&lt;T&gt;,你应该确保object.Equalsobject.GetHashCodeIEquatable&lt;T&gt;.Equals都有匹配的实现;对于 2 个 Equals 方法,这可以再次通过使用从两者调用的单个方法来完成。

您的列表可能是List&lt;Lemon&gt;;它仍然应该正确排序。这也将使访问像diamond()这样的方法变得容易:

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

【讨论】:

  • 但是我需要在 main 中创建接口变量吗?像 IComparable temp = new Lemon("Git", 99);
  • @user3662708 取决于;你想在那些不在公共 API 上的接口上调用任何方法吗?你的代码没有,所以Lemon temp = new Lemon(...)var temp = new Lemon(...) 没问题。
  • 我需要明确地实现 IComparable。所以 Lemon temp = new Lemon(...) 不明确
  • @user3662708 与 IComparable 是否显式实现无关。在我的示例中,尽管使用了显式接口实现,它仍然可以正常工作。
  • 我正在制作项目是一个问题,其中一个要求是明确实现标准接口
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 2014-12-25
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多