You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动