0

我对 C# 中的继承有疑问。我有一个定义受保护虚拟成员的公共抽象类 A。我有另一个从 A 继承的抽象类 B,然后是另一个从 B 继承的内部类 C。第一个类 A 在单独的命名空间中,另外两个在同一个命名空间中,但包含对第一个的引用。

我试图使用 base 关键字访问 C 中 A 的受保护虚拟成员,但除非我在 B 中提供一个方法然后在那里调用 A 的受保护虚拟成员,否则我无法访问。

我想知道我试图做的事情是否可行,即我做错了什么?或者如果不可能,那为什么?谢谢。

这是代码示例:

  namespace A
  {

     public abstract class BaseClass
     {
         protected virtual string GetData()
         {
             //code to get data
         }
     }
  }

  namespace B  //includes a reference to A
  {
     abstract class DerivedClassA : BaseClass
     {

     }


     internal class DerivedClassB: DerivedClassA
     {
          public void write()
          {
             base.GetData(); // results in error.

             // The name 'GetData' does not exist in the current context
             // and DerivedClassA does not contain a definition for 'GetData'
          }
     }
4

3 回答 3

2

除了命名空间问题之外,您的代码运行良好,我必须更改的一件事是更改DerivedClassA

abstract class DerivedClassA : A.BaseClass
{

}

我怀疑在您的真实项目中调用的任何名称都在名称空间或您在代码顶部的语句中包含的其他名称空间BaseClass中有一个同名的类。例如,这将重新创建您的错误Busing

  namespace A
  {

     public abstract class BaseClass
     {
         protected virtual string GetData()
         {
             throw new NotImplementedException();
         }
     }
  }

  namespace B  //includes a reference to A
  {
     public abstract class BaseClass
     {
     }


     abstract class DerivedClassA : BaseClass
     {

     }


     internal class DerivedClassB: DerivedClassA
     {
          public void write()
          {
             base.GetData(); // results in error.

             // The name 'GetData' does not exist in the current context
             // and DerivedClassA does not contain a definition for 'GetData'
          }
     }
  }

检查您是否没有另一个名称空间与 in 使用相同的名称BaseClass或明确定义BaseClassin的名称空间DerivedClassA

于 2013-10-22T17:49:10.493 回答
0

找到了问题的根源。显然,第二个命名空间所引用的 dll 的位置已经改变,因此它指向了一个过时的引用。在我从正确的位置更新引用后,它运行良好。谢谢大家的帮助。

于 2013-10-28T14:13:48.970 回答
0

这对我有用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Protectedmemberinabstractclassex
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
namespace A
{

    public abstract class BaseClass
    {
        protected virtual string GetData()
        {
            throw new NotImplementedException();
        }
    }
}

namespace B  //includes a reference to A
{


    abstract class DerivedClassA : A.BaseClass
    {

    }


    internal class DerivedClassB : DerivedClassA
    {
        public void write()
        {
            base.GetData();
        }
    }
}
于 2013-10-24T19:53:42.773 回答