Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#类不实现继承的抽象成员_C# - Fatal编程技术网

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

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.

如果我问了一些愚蠢的问题,我很抱歉,但我对C#和ASP.NET完全是个新手。 我的代码有一个错误,我不明白。 我正在Visual Studio 2008上工作

在这一行代码中:

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必须能够区分抽象成员的实现和隐藏抽象成员的潜在新成员。因此,真正的问题是,为什么不允许同时覆盖和隐藏成员(无论是抽象成员还是虚拟成员),因为不会有歧义。我想将“我希望确保此方法在从我派生的每个具体类中都可用”改为“我希望确保从我派生的每个具体类都实现此方法的自定义特定逻辑”