从抽象类继承C#

时间:2013-10-22 17:00:26

标签: c# inheritance abstract-class internal

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

我试图使用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'
          }
     }

3 个答案:

答案 0 :(得分:3)

除名称空间问题your code ran fine之外,我必须更改的一件事是将DerivedClassA更改为

abstract class DerivedClassA : A.BaseClass
{

}

我怀疑在您的真实项目中调用了BaseClass,您在命名空间B中有一个同名的类,或者您在using语句中包含的其他命名空间代码的顶部。例如,这将是recreate your error

  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'
          }
     }
  }

检查您是否没有使用与BaseClass相同名称的其他命名空间,或在BaseClass中明确定义DerivedClassA的命名空间

答案 1 :(得分: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();
        }
    }
}

答案 2 :(得分:0)

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