更改访问修饰符解决方法

时间:2012-11-20 18:23:42

标签: c#

我是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'

访问修饰符问题是否有任何变通方法,有人可以解释'声明一个正文,因为它没有标记'错误吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

GetKeyForItem在基本抽象类中受到保护,因此必须在派生类中对其进行保护。 (另外,我想你会想要实现它 - 这是你的第二个错误的来源,因为方法必须有一个正文,除非它们是抽象的。)

这应该编译:

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

    // to implement, you'd write "return item.SomePropertyOfGClass2;"
}

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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
}

即使它什么都不做。