c# - 继承 - 无法访问派生类中的基类数据成员

标签 c# .net inheritance

继承的一个疑惑,我有两个类AB
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.

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

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

reference Image

 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/

相关文章:

javascript - 创建原型(prototype)链最安全、跨浏览器广泛支持的方法是什么?

java - Hibernate 和 JPA 的好的继承策略是什么?

c# - 如何在泛型方法中使用泛型类型

java - jni4net - 如何设置 jni4net.j-0.7.1.0.jar 的绝对路径

c# - 在 C# 中将枚举与字符串相关联

.net - 通过新的 async/await 异步使用 Linq to Sql

.net - Powershell - 处理 Windows 窗体事件

c# - 依赖注入(inject)的 Xamarin iOS Controller 自定义继承问题

c# - 发布包中缺少 App_global.asax.compiled 和 App_global.asax.dll

c# - 如何在 ServiceStack.net 中使用 Funq 注册多个 IDbConnectionFactory 实例