1

CompareTo メソッドを Artist クラスから動作させようとしていますが、Album クラスから AlbumName を取得できません。Album クラスの 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) メソッドがないことを示しています。あなたのコードはそれを確認します。だから... 1つ追加してください!

編集

では、分解してみましょう。あなたは明らかに多くのことを学んでおり、多くの新しいことを試しています。それは素晴らしいことです。目標とツールの両方について確固たる考えを持っていると役に立ちますので、それらについて話しましょう。

あなたのコメントに基づいてIComparable、フォーム内の一意性の順序付けと保証に使用するつもりであることは明らかです。通常IComparable、一意性には使用されませんが、それを使用する「ビジネス要件」があるため...

手元にあるツールについて話しましょう。意味を理解する必要があると思いますIComparable。これは、それを実装するクラスが、リスト内の数字や (エヘム) 名前のように、自然な順序付けを持っていることを意味します。具体的には、次の 3 つの例外的でない結果が保証されます。

  1. this引数より「小さい」: 0 より小さい数値を返す
  2. this引数より「大きい」: 0 より大きい数値を返す
  3. this引数と同じ順序で、0 を返します。

それでおしまい。

インターフェイスを使用するものは、アイテムを並べ替えるコレクションになる傾向があります。彼らはその番号を使用して、並べ替えをガイドします。彼らが気にする唯一のことは、数値がゼロより小さいか、大きいか、またはゼロに等しいかどうかです。リターン番号はそれ以外には何の意味もないので-999、あなたがそうして戻ってきても、誰かに有益なことを伝えることにはなりません. あなたが本当に持っているものを比較できない場合、正しいことは例外をスローすることです。

がどのようIComparableに使用されているかがわかるといいのですが、通常はどのように実装されるかについて話しましょう。

ジェネリックって聞いたことありますか?これは、型に基づいてコードのコンパイルと実行をガイドする .NET の基本的な機能です。インターフェイスがジェネリックである場合、それは、毎回異なる型を指定して、複数回実装できることを意味します。:の一般的なバージョンがありIComparableますSystem.IComparable<T>。クラスで文字列を比較する必要がある場合は、what-have-youIComparable<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");
}

最後に、アーティストのリストが Album クラスにあるのはなぜですか? 一意性のチェックをどこで行う必要があるかを考えてください。ユーザーがフォームに入力すると発生しますよね?リストもそこに属していると思いませんか?

于 2013-03-20T17:42:31.680 に答える