继承方面存在一个疑问,我有两个名为 A 和 B 的班级。
A 是基类, B 是派生类。
B类继承A类的两个数据成员和两个成员函数。
在派生类中,访问静态数据成员是工作但是 访问非静态数据成员会出错。同样的情况是这样的 也适用于会员职能。我无法访问非静态成员函数。
如果我访问静态或非静态变量|在任何派生类函数内部函数它工作正常。
为什么我无法直接在课堂上访问。当我访问任何派生类函数时,为什么它不显示错误。请任何人澄清我的疑虑。
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();
}
}
答案 0 :(得分:7)
这一行是非法的:
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();
}
构造函数的主体在派生类的字段初始值设定项,基类的字段初始值设定项和基类的构造函数体之后运行。派生的构造函数体运行 last ,因此您知道它访问的所有东西都已创建。
虽然我们正在努力:请注意,C#中的方法传统上以大写字母开头。
此外,此代码中没有显示出完全复制的理由。您已经可以从派生类访问基类成员,那么为什么要将它们复制到派生类中?
答案 1 :(得分:1)
如果我访问静态或非静态变量|任何派生类函数里面的函数都可以正常工作。
为什么我无法直接在课堂上访问。当我访问任何派生类函数时,为什么它不显示错误。请任何人澄清我的疑虑。
换句话说,你的问题是:为什么我可以访问类级别的静态字段(在任何方法或属性之外),而不是实例字段。
静态字段是每个类。您不需要该类的实例,但您需要该类可用。因此,如果该类可用,则可以访问它。
现在让我们转到非静态字段。这是您的课程,请注意评论中的数字:
class B : A {
string copyMsg1 = msg1; <-- 1. assign non-static to non static
string copyMsg2 = msg2; <-- 2. assign static to non static
string getMsg1 = alert1(); <-- 3. non static calling non-static
string getMsg2 = alert2(); <-- 4. non static calling static
void display() {
msg1 = "";
msg2 = "";
alert2();
}
}
A
的实例可用。 答案 2 :(得分:0)
在setter方法中调用非静态方法:
class A
{
protected string alert()
{
return "me";
}
}
class B :A
{
private string s;
private void setS()
{
s = alert();
}
}