【问题标题】:C# class does not implement inherited abstract memberC# 类不实现继承的抽象成员
【发布时间】:2009-12-16 19:08:19
【问题描述】:

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

在这行代码中:

public class SQLFAQProvider : DBFAQProvider

我收到此错误:

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

当我转到DBFAQProvider 时,错误出现在这行代码中:

public abstract DBFAQ DeleteFAQbyID(int fAQID);

我应该改变什么来纠正它?

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

    【讨论】:

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

    当您从 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.
    }
    

    【讨论】:

    • 请注意,为了实现一个方法,必须将其声明为“覆盖”,否则错误将持续存在
    【解决方案3】:

    当一个类从一个抽象类继承时,它必须实现该类定义的所有抽象方法。这是类接口,抽象方法可以认为是纯虚函数,即必须由子类实现但在基类中实现没有意义的函数。

    【讨论】:

      【解决方案4】:

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

      如果你不知道怎么做,那么至少做:

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

      【讨论】:

        【解决方案5】:

        在派生类中实现DeleteFAQbyID 方法:

        public override DBFAQ DeleteFAQbyID(int fAQID)
        {
            // Put your code here
        }
        

        抽象方法的意义在于(在抽象基类中)“我想确保这个方法在从我派生的每个具体类中都可用”——由你来提供实现。有点像接口中的方法。

        【讨论】:

        • 我将把“我想确保这个方法在从我派生的每个具体类中都可用”重新表述为“我想确保从我派生的每个具体类都为此实现自定义特定逻辑方法”
        【解决方案6】:

        因为您的SQLFAQProvider 类不是abstract,它必须实现它继承的每个abstract 方法。

        要解决此问题,请在 SQLFAQProvider 中实现 DeleteFAQbyID 方法,如下所示:

        public override DBFAQ DeleteFAQbyID(int fAQID) {
            //Do something
        }
        

        或者,您可以通过将 SQLFAQProvider 的声明更改为 public abstract class SQLFAQProvider 来使您的 SQLFAQProvider 类为 abstract

        【讨论】:

          【解决方案7】:

          您的子类 (SQLFAQProvider) 必须提供方法 DeleteFAQbyID 的实现代码,因为父类 (DBFAQProvider) 没有。

          【讨论】:

            【解决方案8】:

            在抽象类中使用IsValid 之类的实体属性。使其返回您要在派生类中覆盖的抽象方法。

            在抽象基类中:

            public bool IsValid
            {
                get
                {
                    return  DeleteFAQbyID();
                }
            }
            
            public abstract bool DeleteFAQbyID();
            

            现在在派生类中,它将覆盖抽象类的方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-08
              相关资源
              最近更新 更多