Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与不起作用的方法相比,它赢了;I don’我想我不能从Album类中获得AlbumName——我认为是IComparable问题_C#_Error Handling_Icomparable - Fatal编程技术网

C# 与不起作用的方法相比,它赢了;I don’我想我不能从Album类中获得AlbumName——我认为是IComparable问题

C# 与不起作用的方法相比,它赢了;I don’我想我不能从Album类中获得AlbumName——我认为是IComparable问题,c#,error-handling,icomparable,C#,Error Handling,Icomparable,我正在尝试让我的CompareTo方法从Artist类开始工作,但是它无法从Album类获得AlbumName。我很确定这是专辑课上的一个问题。请帮助回答特定于代码的问题,谢谢 错误1“Assignment.Album”未实现接口成员“System.IComparable.CompareTo(对象)”的 专辑类别: using System; using System.Collections.Generic; using System.Linq; using System.Text; name

我正在尝试让我的CompareTo方法从Artist类开始工作,但是它无法从Album类获得AlbumName。我很确定这是专辑课上的一个问题。请帮助回答特定于代码的问题,谢谢

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

专辑类别:

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    
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
名称空间分配
{
公共级艺术家:IComparable
{
私有字符串名称;
int members=4;//默认成员数
//字符串名称;
LinkedList albums=新建LinkedList();
public override string ToString()//创建我自己的ToString方法
{
返回(“姓名:“+姓名+”成员人数:“+成员”);
}
公共艺术家(字符串名,int成员)//构造函数
{
this.name=名称;
这个.成员=成员;
}
公共字符串名
{
获取{返回名称;}
集合{name=name;}
}
公共int成员
{
获取{返回成员;}
集合{members=value;}
}
公共整数比较(对象对象对象)
{
if(obj是艺术家)//按名称比较
{
艺术家其他=(艺术家)obj;
返回name.CompareTo(other.name);//艺术家名称
}
if(obj是string)//与专辑标题列表进行比较
{
字符串other=obj.ToString();
if(对象等于(名称)
返回0;
返回-1;
}
其他的
return-999;//表示无法进行比较
}
}
}

您发布的错误消息指出,Album类中没有Compare(object)方法。你的密码证实了这一点。所以加一个

编辑

好的,让我们把它分解一下。你显然学到了很多,尝试了很多新东西。太好了。对你的目标和工具有一个坚实的概念是有帮助的,所以让我们来谈谈这些

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

让我们谈谈手头的工具。我想你只需要理解什么是可比较的。这意味着实现它的类具有自然顺序,就像列表中的数字或(ahem)名称一样。具体而言,它保证了三个非例外结果:

  • 是“小于”参数:返回一些小于0的数字
  • 大于参数:返回一些大于0的数字
  • 与参数的顺序相同:返回0
  • 就这样

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

    因此,希望您对如何使用
    IComparable
    有所了解,让我们讨论一下它通常是如何实现的

    你听说过仿制药吗?它是.NET的一个基本功能,它将根据类型指导代码的编译和执行。如果接口是泛型的,这意味着您可以多次实现is,每次指定不同的类型。有一个通用版本的
    IComparable
    System.IComparable
    。如果您的类需要比较字符串,它应该实现
    IComparable
    以及
    IComparable
    或您所拥有的东西。如果您这样做,您的类将如下所示:

    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
    实现将一种类型与另一种类型进行比较是非常奇怪的。(事实上,现在你通常会实现
    IComparable
    )当然,编译器是完全正确的-你的
    Album
    类没有
    CompareTo
    方法。你为什么要将艺术家列表中的变量命名为
    albums
    ?艺术家和专辑是不同的东西!从根本上说,我认为你可能需要后退一步,找出你真正想要达到的目标,然后重新开始。这是为了一种形式——作为任务的一部分,我们被告知将专辑作为艺术家的单独课程,而不是包含在其中。在形式上,它应该防止同一个艺术家或专辑被输入两次。这适用于艺术家,但不适用于专辑。我从未说过
    artist
    Album
    应该是同一个类。但是你不应该用
    IComparable
    来比较两者。相反,你应该将艺术家和专辑中的所有名字提取到一个
    哈希集中。
    。嗨,谢谢你的回答,我之前试过添加一个,但没有解决问题。哇,谢谢你花时间解释所有这些东西,也许如果我更详细地解释作业,它会把我试图做的事情放到上下文中。我们应该有一个使用AVL树的表单,允许用户添加、删除和编辑艺术
    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");
    }