1

私はC#にかなり慣れていないので、これがばかげた質問であれば許してください。エラーが発生していますが、解決方法がわかりません。Visual Studio 2010 を使用しています。既にコミュニティ メンバーからいくつかの修正を実装しましたが、問題が発生し続けているようです。

このコード行から始まりました

public class GClass1 : KeyedCollection<string, GClass2>

私は私にエラーを与えました

'GClass1' does not implement inherited abstract member 'System.Collections.ObjectModel.KeyedCollection<string,GClass2>.GetKeyForItem(GClass2)'

私が読んだことから、これは継承されたクラスに抽象メンバーを実装することで解決できます

public class GClass1 : KeyedCollection<string, GClass2>
{
  public override TKey GetKeyForItem(TItem item);
  protected override void InsertItem(int index, TItem item)
  {
    TKey keyForItem = this.GetKeyForItem(item);
    if (keyForItem != null)
    {
        this.AddKey(keyForItem, item);
    }
    base.InsertItem(index, item);
}

ただし、「型または名前空間名が見つかりませんでした TKey/TItem が見つかりませんでした」というエラーが表示されました。そこで、プレースホルダー型を置き換えました。

現在、コードは

public class GClass1 : KeyedCollection<string, GClass2>
{

  public override string GetKeyForItem(GClass2 item);
  protected override void InsertItem(int index, GClass2 item)
  {
    string keyForItem = this.GetKeyForItem(item);
    if (keyForItem != null)
    {
      this.AddKey(keyForItem, item);
    }
  base.InsertItem(index, item);
 }

GetKeyForItem が保護されていることをすっかり忘れていました。新しいエラーは、System.Collections.ObjectModel.KeyedCollection.GetKeyForItem(GCl‌ ass2) をオーバーライドするときにアクセス修飾子を変更できないことを示しています。

「GClass1.GetKeyForItem(GClass2)」は、abstract、extern、または partial とマークされていないため、本体を宣言する必要があるという奇妙なエラーも発生します。

アクセス修飾子の問題に対する回避策はありますか?また、誰かが「マークされていないためボディを宣言する」エラーを説明できますか?

ありがとう!

4

3 に答える 3

2

抽象メソッドは、定義されているとおりに正確に実装する必要があります。そのメソッドをパブリックにアクセス可能にする場合は、定義されたアクセシビリティだけでなく、protectedそれを使用する新しい別個のメソッドを追加する必要があります。

public class GClass1 : KeyedCollection<string, GClass2>
{
    protected override string GetKeyForItem(GClass2 item)
    {
        throw new NotImplementedException();
    }

    public string GetKey(GClass2 item)
    {
        return GetKeyForItem(item);
    }
}
于 2012-11-20T18:30:33.863 に答える
2

GetKeyForItemは基本抽象クラスで保護されているため、派生クラスで保護する必要があります。(また、あなたはそれを実装したいと思うでしょう-メソッドは抽象的でない限り本体を持たなければならないので、それがあなたの2番目のエラーの原因です。)

これはコンパイルする必要があります:

protected override string GetKeyForItem(GClass2 item)
{
    throw new NotImplementedException();

    // to implement, you'd write "return item.SomePropertyOfGClass2;"
}
于 2012-11-20T18:27:20.867 に答える
0

エラーはおそらく、単にクラス内でメソッドを宣言するのではなく、メソッドを実装'GClass1.GetKeyForItem(GClass2)' must declare a body because it is not marked abstract, extern, or partial'する必要があることを意味します。実際、コードのブロックを追加する必要があります

protected override string GetKeyForItem(GClass2 item)
{
     // some code
}

たとえ何もしなくても。

于 2012-11-20T18:29:51.767 に答える