C# 继承-Can';t访问派生类中的基类数据成员

C# 继承-Can';t访问派生类中的基类数据成员,c#,.net,inheritance,C#,.net,Inheritance,关于继承的一个疑问是,我有两个类,分别命名为A和B A是基类,B是派生类。 继承一个类的两个数据成员和两个成员函数的B类 在派生类中,访问静态数据成员正在工作,但 访问非静态数据成员时出错。同样的情况也是如此 也适用于成员功能。我无法访问非静态成员函数 如果我在任何派生类函数中访问静态或非静态的变量|函数,它工作正常 为什么我不能在类中直接访问。当我访问任何派生类函数内部时,为什么不显示错误。任何人请澄清我的疑问 在setter方法内调用非静态方法: class A { p

关于继承的一个疑问是,我有两个类,分别命名为AB
A基类B派生类。 继承一个类的两个数据成员和两个成员函数的B类

在派生类中,访问静态数据成员正在工作,但 访问非静态数据成员时出错。同样的情况也是如此 也适用于成员功能。我无法访问非静态成员函数

如果我在任何派生类函数中访问静态或非静态的变量|函数,它工作正常

为什么我不能在类中直接访问。当我访问任何派生类函数内部时,为什么不显示错误。任何人请澄清我的疑问


在setter方法内调用非静态方法:

class A
   {
       protected string alert()
       {
           return "me";
       }
   }

    class B :A
    {
        private string s;

        private void setS()
        {
            s = alert();
        }
    }
这条线是非法的:

string getMsg1 = alert1();
因为它相当于

string getMsg1 = this.alert1();
在字段初始值设定项中访问
是非法的。为什么?因为字段初始值设定项在派生类构造函数或基类构造函数之前运行,因此可以调用依赖于已运行构造函数的方法

正确的解决方案是将初始化放入构造函数中:

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#中的方法通常以大写字母开头

此外,在这段代码中根本没有显示进行复制的好理由。您已经可以从派生类访问基类成员,那么为什么要将它们复制到派生类中呢

如果我访问任何派生类函数中的静态或非静态变量|函数,它工作正常

为什么我不能在类中直接访问。当我访问任何派生类函数内部时,为什么不显示错误。任何人请澄清我的疑问

换句话说,您的问题是:为什么我可以访问类级别的静态字段(在任何方法或属性之外),而不能访问实例字段

静态字段是每个类的。您不需要该类的实例,但需要该类可用。因此,如果该类可用,则可以访问它

现在让我们转到非静态字段。这是您的班级,请注意备注中的数字:

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();           
    }
}
B类:A类{

string copyMsg1=msg1;将代码替换为图片。这样我们就可以复制它。@Farzin Kanzi在我的问题中添加了代码。请检查一下,
alert
是一个实例方法。如果没有类的实例,你就不能访问它。你不能在字段初始值设定项中访问
。无论它是类成员还是基类成员。@CKK,我已经访问了基类的
alert
函数,但没有在派生类函数
display
中创建实例。请参考这是一个很好的答案。您可以在子类的方法中使用继承的对象。@AliEzzatOdeh,好的,为什么我不能直接访问它。您不能直接调用非静态方法而不调用它来自实例(对象),因为非静态方法是每个实例的,但是您可以从方法的实现调用它,这里的setter,除非创建了对象,否则不会调用它。另一方面,所有对象都共享静态方法,因此可以调用它,而无需创建对象(直接从类调用)你解释得很好,这个程序没有逻辑,我只是为了解释我的问题而创建的
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();           
    }
}