C#类没有实现继承的抽象成员

sol*_*004 15 c#

如果我问一些愚蠢的东西,我很抱歉,但我完全是C#和ASP.NET的新手.我的代码中有错误,我不明白.我正在使用Visual Studio 2008.

在这行代码中:

public class SQLFAQProvider : DBFAQProvider
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Moby.Commerce.DataAccess.FAQ.SQLFAQProvider 不实现继承的抽象成员 Moby.Commerce.DataAccess.FAQDBFAQProvider.DeleteFAQbyID(int)

当我转到DBFAQProvider错误是在这行代码中:

public abstract DBFAQ DeleteFAQbyID(int fAQID);
Run Code Online (Sandbox Code Playgroud)

我该怎么改变来纠正它?

Qui*_*son 22

首先想到的是在继承的类ala中实现抽象成员:

public class SQLFAQProvider : DBFAQProvider
{
    public override DBFAQ DeleteFAQbyID(int fAQID)
    {
        //TODO: Real Code
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当我必须实现抽象成员时,它需要override关键字是没有意义的. (5认同)
  • IMO在具体类中正确地需要`override`关键字,因为抽象成员可以在从具体类派生的类中被进一步覆盖.否则,它看起来像派生类的成员会覆盖非虚拟或非抽象成员.此外,CLR必须能够区分抽象成员的实现和隐藏抽象成员的潜在新成员.真正的问题是为什么不允许这样做,即同时覆盖和隐藏一个成员(无论是抽象的还是虚拟的),因为没有歧义. (2认同)

Jon*_*eet 22

DeleteFAQbyID在派生类中实现该方法:

public override DBFAQ DeleteFAQbyID(int fAQID)
{
    // Put your code here
}
Run Code Online (Sandbox Code Playgroud)

抽象方法的要点是(在抽象基类中),"我想确保这个方法在从我派生的每个具体类中都可用" - 由你来提供实现.这有点像界面中的方法.


Chr*_*ore 11

您的子类需要显式实现该特定方法.

如果您不知道该怎么做,那至少应该:

public override DBFAQ DeleteFAQbyID(int fAQID)
{
    throw new NotImplementedException("This isn't done yet");
}
Run Code Online (Sandbox Code Playgroud)


LBu*_*kin 5

当您从C#中的类继承时,abstract除非您的类本身被标记为,否则您需要实现标记为的所有方法abstract.抽象类是无法在运行时直接实例化的类,因为它们没有完全实现基类所必须存在的所有必需方法.

抽象方法是一种机制,允许类指示特定方法必须"最终"存在 - 而不必在此时提供实现.当您不能或不想指定特定实现应该执行的操作时,通常使用抽象类,但是您需要预先定义最终将依赖的方法.

要解决您的问题,请将您的类标记为抽象(期望另一级继承将填充缺失的部分)或在您的类中实现DeleteFAQbyId():

public DBFAQ DeleteFAQbyID(int fAQID)
{
    // write appropriate implementation here or:
    throw new NotImplementedException();
    // or possibly NotSupportedException() if the operation should can't ever be supported.
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,为了实现方法,必须将其声明为"覆盖",否则错误将持续存在 (3认同)