我对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'
}
}
答案 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的位置已经改变,因此,它指向过时的引用。我从正确的位置更新了引用后,运行正常。谢谢大家的帮助。