C#中通过基类对象访问派生类变量的问题
解决基类无法访问派生类成员的问题
嘿,这个问题我熟得很!你碰到的是典型的C#访问权限问题——基类B没法访问派生类D1里的var1,大概率是因为你把var1设成了private(C#里类成员默认就是private),而private成员只能在定义它的类内部访问,连它的基类都没权限碰。既然var1必须留在D1里,给你几个实用的解决办法:
调整
var1的访问修饰符
如果你不介意让同一程序集内的类访问var1,可以把它改成internal;如果需要全局访问就用public。这样基类B就能直接访问了:class D1 : B { internal int var1 = 10; // 同一程序集内可访问 // 或者 public int var1 = 10; // 全局可访问 }封装
var1,通过属性/方法暴露
要是想保持var1的private封装性,就给它加一个对外的访问入口,比如只读属性。这是更符合面向对象设计的做法:class D1 : B { private int var1 = 10; // 保持private不变 // 提供只读的内部属性给基类访问 internal int Var1 => var1; // 如果需要允许修改,可以写成: // internal int Var1 { get; private set; } = 10; }之后在B里就可以通过
d.Var1来获取值了。用抽象/虚属性实现多态访问
如果你这是架构层面的设计,希望所有派生类都提供类似var1的成员,那可以在基类里定义抽象属性,让派生类去实现它。这样基类还能通过多态来访问:abstract class B { public void SomeMethod() { // 多态场景下,基类引用指向派生类实例也能访问 B b = new D1(); Console.WriteLine(b.Var1); } // 声明抽象属性,要求派生类必须实现 public abstract int Var1 { get; } } class D1 : B { private int var1 = 10; // 实现基类的抽象属性 public override int Var1 => var1; }
你可以根据自己的场景选最适合的方案:临时解决用第一个最快,注重封装选第二个,架构设计选第三个准没错。
内容的提问来源于stack exchange,提问作者mahemad




