【问题标题】:Preventing Access Public Member of Base Class From Derived Class in C#在 C# 中防止派生类访问基类的公共成员
【发布时间】:2021-09-26 12:19:11
【问题描述】:

这是否可以防止派生类实例访问基类的公共成员(如方法、变量等)?例如;

public class BaseClass
{
    public int m_a;
}

public class DerivedClass : BaseClass
{
    base.m_a = 10; //good
}

但是,我不想这样;

DerivedClass dc = new DerivedClass();
dc.m_a = 20; //not good

这可能吗?

【问题讨论】:

  • 为什么你想这样做?
  • 这不只是protected 而不是public
  • @Charlieface 不是这样,因为这也会对BaseClass 的消费者隐藏它。
  • public new void m_a() { } in DerivedClass 会隐藏现有字段 - 但它有点难看。 ;)
  • @mjwills 鉴于DerivedClass 的实例本身BaseClass 的实例,无论如何我不知道如何以这种方式区分它们。所以它必须是protectedpublic。如果DerivedClass 可以用protectedprivate 覆盖,那么您就只能失望了。 (而且你不能覆盖字段)

标签: c# class inheritance base derived


【解决方案1】:

试试这个

public static void Main()
{
DerivedClass dc = new DerivedClass();
dc.m_a = 20; // ERROR!

}


public class BaseClass
{
    protected int m_a;
}

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {
        m_a=20; //No Error
    }
}

【讨论】:

    【解决方案2】:

    protected表示派生类可以访问它,但是派生类也可以访问自己实例的属性。

           static void Main(string[] args)
            {
                BaseClass bc = new BaseClass();
                DerivedClass dc = new DerivedClass();
               
               
                dc.doSomething(); //set value of baseClass from DerivedClass
    
                // dc.m_a = 20; //'Program.BaseClass.m_a' is inaccessible due to its protection level
                // bc.m_a = 20; //'Program.BaseClass.m_a' is inaccessible due to its protection level
    
    
                Console.WriteLine("Hello World!");
            }
    
           
            class BaseClass {
                protected int m_a;
    
                public void setValue(int m_a) {
                    this.m_a = m_a;
                }
            }
    
            class DerivedClass : BaseClass {
                BaseClass baseClass = new BaseClass();
               
                public void doSomething() {
                    this.m_a = 5;          // valid. You are accessing your own variable
                    //baseClass.m_a = 5;   // invalid. You are attempting to access the protected property externally
                    baseClass.setValue(5); // valid. Using a public setter
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 2018-05-07
      • 1970-01-01
      • 2015-08-09
      • 2018-04-17
      • 2011-01-27
      • 2020-08-27
      • 2012-09-16
      • 2013-12-05
      相关资源
      最近更新 更多