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