继承的一个疑惑,我有两个类A和B。
A 是基类,B 是派生类。
B类继承了A类的两个数据成员和两个成员函数。
In derived class, accessing the static data member is Working but accessing the non static data member gives error. This same case is also for Member Functions. I can't access non static member function.
如果我访问静态或非静态变量|任何派生类函数中的函数都可以正常工作。
为什么我不能在类里面直接访问。为什么当我访问任何派生类函数内部时它不显示错误。任何人都请澄清我的疑问。
class A
{
protected string msg1;
protected static string msg2;
protected string alert1() {
return "Welcome";
}
protected static string alert2()
{
return "Welcome All";
}
}
class B : A {
string copyMsg1 = msg1;
string copyMsg2 = msg2;
string getMsg1 = alert1();
string getMsg2 = alert2();
void display() {
msg1 = "";
msg2 = "";
alert2();
}
}
最佳答案
这一行是非法的:
string getMsg1 = alert1();
因为它等同于
string getMsg1 = this.alert1();
并且在字段初始值设定项中访问 this
是非法的。为什么?因为字段初始值设定项在派生类构造函数或基类构造函数之前运行,因此您可以调用依赖于已经运行的构造函数的方法。
正确的解决方案是将初始化放入构造函数中:
class B : A {
string copyMsg1;
string copyMsg2;
string getMsg1;
string getMsg2;
public B()
{
this.copyMsg1 = this.msg1;
this.copyMsg2 = A.msg2;
this.getMsg1 = this.alert1();
this.getMsg2 = A.alert2();
}
构造函数的主体在派生类的字段初始值设定项、基类的字段初始值设定项和基类的构造函数主体之后运行。派生的构造函数主体最后运行,因此您知道它访问的所有内容都已创建。
说到这里:请注意,C# 中的方法传统上以大写字母开头。
此外,此代码中根本没有显示进行复制的充分理由。您已经可以从派生类访问基类成员,那么为什么还要将它们复制到派生类中呢?
关于c# - 继承 - 无法访问派生类中的基类数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42054176/