C#类不实现继承的抽象成员
如果我问了一些愚蠢的问题,我很抱歉,但我对C#和ASP.NET完全是个新手。 我的代码有一个错误,我不明白。 我正在Visual Studio 2008上工作 在这一行代码中:C#类不实现继承的抽象成员,c#,C#,如果我问了一些愚蠢的问题,我很抱歉,但我对C#和ASP.NET完全是个新手。 我的代码有一个错误,我不明白。 我正在Visual Studio 2008上工作 在这一行代码中: public class SQLFAQProvider : DBFAQProvider public abstract DBFAQ DeleteFAQbyID(int fAQID); 我得到这个错误: Moby.Commerce.DataAccess.FAQ.SQLFAQProvider未实现继承的抽象成员Moby.
public class SQLFAQProvider : DBFAQProvider
public abstract DBFAQ DeleteFAQbyID(int fAQID);
我得到这个错误:
Moby.Commerce.DataAccess.FAQ.SQLFAQProvider
未实现继承的抽象成员Moby.Commerce.DataAccess.FAQDBFAQProvider.DeleteFAQbyID(int)
当我转到DBFAQProvider
时,错误在这行代码中:
public class SQLFAQProvider : DBFAQProvider
public abstract DBFAQ DeleteFAQbyID(int fAQID);
我应该更改什么来更正它?您的子类(SQLFAQProvider)必须为方法DeleteFAQbyID提供实现代码,因为父类(DBFAQProvider)没有提供实现代码。首先考虑的是在继承的类中实现抽象成员:
public class SQLFAQProvider : DBFAQProvider
{
public override DBFAQ DeleteFAQbyID(int fAQID)
{
//TODO: Real Code
return null;
}
}
在派生类中实现
DeleteFAQbyID
方法:
public override DBFAQ DeleteFAQbyID(int fAQID)
{
// Put your code here
}
抽象方法的要点是说(在抽象基类中),“我想确保这个方法在从我派生的每个具体类中都是可用的”——由您来提供实现。它有点像接口中的方法。当一个类从抽象类继承时,它必须实现该类定义的所有抽象方法。这是类接口,抽象方法可以被认为是纯虚拟函数,即必须由派生类实现的函数,但在基类中实现没有意义。您的子类需要显式实现该特定方法 如果你不知道怎么做,那么至少要做:
public override DBFAQ DeleteFAQbyID(int fAQID)
{
throw new NotImplementedException("This isn't done yet");
}
因为您的
SQLFAQProvider
类不是abstract
,它必须实现它继承的每个abstract
方法
要解决此问题,请在SQLFAQProvider
中实现DeleteFAQbyID
方法,如下所示:
public override DBFAQ DeleteFAQbyID(int fAQID) {
//Do something
}
或者,当您从C#中的类继承时,您可以通过将其声明更改为
公共抽象类SQLFAQProvider
使您的SQLFAQProvider
类成为抽象类,除非类本身被标记为抽象
,否则需要实现所有标记为抽象
的方法。抽象类是不能在运行时直接实例化的类,因为它们没有完全实现基类所说必须存在的所有必需方法
抽象方法是一种机制,它允许类指示特定方法必须“最终”存在,而不必在此时提供实现。当您不能或不想指定特定实现应该做什么时,通常使用抽象类,但您需要预先定义最终将依赖的方法
要解决此问题,请将类标记为抽象类(期望另一个继承级别将填充缺少的部分),或者在类中实现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.
}
在抽象类中,使用像IsValid
这样的实体属性。使其返回要在派生类中重写的抽象方法
在抽象基类中:
public bool IsValid
{
get
{
return DeleteFAQbyID();
}
}
public abstract bool DeleteFAQbyID();
现在在派生类中,它将覆盖抽象类的方法。注意,为了实现方法,必须将其声明为“覆盖”,否则错误将持续存在。当必须实现抽象成员时,它需要override关键字对我来说没有意义。在我看来,在具体类中正确地需要override
关键字,因为抽象成员可以在从具体类派生的类中进一步重写。否则,它看起来像是派生类的成员重写了非虚拟或非抽象成员。此外,CLR必须能够区分抽象成员的实现和隐藏抽象成员的潜在新成员。因此,真正的问题是,为什么不允许同时覆盖和隐藏成员(无论是抽象成员还是虚拟成员),因为不会有歧义。我想将“我希望确保此方法在从我派生的每个具体类中都可用”改为“我希望确保从我派生的每个具体类都实现此方法的自定义特定逻辑”