1

我试图让我的 CompareTo 方法从 Artist 类中工作,但是它不会从 Album 类中获取 AlbumName 。我很确定这是专辑类上的 IComparable 的问题。请帮助提供代码特定的答案,谢谢。

错误 1“Assignment.Album”未实现接口成员“System.IComparable.CompareTo(object)”

专辑类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Assignment
{
    class Album : IComparable
    {
        public string albumName;

        public Album(string albumName)//constructors
        {
            this.albumName = albumName;

        }

        public string AlbumName
        {
            get { return albumName; }
            set { albumName = AlbumName; }
        }
    }
}

艺人类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Assignment
{
    public class Artist : IComparable
    {
        private String name;
        int members = 4;//default number of members
        //string albumName;

        LinkedList<Artist> albums = new LinkedList<Artist>();

        public override string ToString()//to make my own toString method
        {
            return ("Name: " + name + "Number of Members: " + members);
        }

        public Artist(string name, int members)//constructors
        {
            this.name = name;
            this.members = members;
        }

        public string Name
        {
            get { return name; }
            set { name = Name; }
        }

        public int Members
        {
            get { return members; }
            set { members = value; }
        }

        public int CompareTo(object obj)
        {
            if (obj is Artist) //compare by name
            {
                Artist other = (Artist)obj;
                return name.CompareTo(other.name);//artist name
            }
            if (obj is string) //compare against list of album titles
            {
                string other = obj.ToString();

                    if (obj.Equals(name.AlbumName))
                        return 0;

                return -1;
            }
            else
                return -999;  //indicates can’t make a comparison    
        }

    }
}
4

1 回答 1

2

您发布的错误消息说您的 Album 类中没有 Compare(object) 方法。您的代码证实了这一点。所以……加一个!

编辑

好的,让我们分解一下。你显然学到了很多东西,并尝试了很多新东西。那太棒了。对你的目标和工具有一个扎实的想法很有帮助,所以让我们来谈谈这些。

根据您的评论,很明显您打算IComparable用于订购和保证表单的唯一性。通常IComparable不用于唯一性,但您有“业务需求”来使用它,所以......

让我们谈谈手头的工具。我想你只需要明白什么IComparable意思。这意味着实现它的类具有自然顺序,例如列表中的数字或(咳咳)名称。具体来说,它保证了三个非异常结果:

  1. this是“小于”参数:返回一些小于 0 的数字
  2. this是“大于”参数:返回大于 0 的数字
  3. this与参数的顺序相同:返回 0。

而已。

使用接口的东西往往是对项目进行排序的集合。他们用这个数字来指导他们的分类。他们唯一关心的是这个数字是小于、大于还是等于零。返回编号不代表任何其他内容,因此-999您返回并不会告诉任何人任何有用的信息。如果您真正拥有的任何东西都无法比较,那么正确的做法是抛出异常。

所以希望你对如何使用有所了解IComparable,让我们谈谈它通常是如何实现的。

你听说过泛型吗?它是 .NET 的一项基本功能,它将根据类型指导代码的编译和执行。如果一个接口是通用的,这意味着你可以实现多次,每次指定不同的类型。有一个通用版本IComparable: System.IComparable<T>。如果你的类需要比较字符串,它应该实现和你有什么IComparable<string>一样好IComparable<Artist>。如果这样做,您的课程将如下所示:

public class Artist : IComparable<string>, IComparable<Artist>
{
    // your code here

    public int Compare(string name)
    {
        // your code here
    }

    public int Compare(Artist artist)
    {
        // your code here
    }
}

如果您正在使用需要非通用IComparable接口的旧技术(如 Windows 窗体),您也可以实现它,如下所示:

public int Compare(object obj)
{
    if (obj == null) return -1; // maybe you want to throw an exception instead?
    if (obj is string) return Compare((string) obj);
    if (obj is Artist) return Compare((Artist) obj);

    throw new ArgumentException("wtf, unexpected type");
}

最后,为什么你的艺术家名单是专辑类的?想想需要在哪里检查唯一性。当用户输入表单时会发生这种情况,对吗?你不认为列表也属于那里吗?

于 2013-03-20T17:42:31.680 回答