如何保护基本字段';s公共/私人

本文关键字:公共 私人 字段 何保护 保护 | 更新日期: 2023-09-27 18:09:43

如果我有ClassA

    public class ClassA
    {
        public string name;
    }

其中"属性名称"为"公共",并且可以从任意位置进行修改。我有ClassB

    public class ClassB : ClassA
    {
        private string name;//But it's not Woking ,name is still public
    }

它继承了ClassA,但我需要在ClassB将name作为私有字段。因此,如果我创建一个ClassB类型的对象,则不能修改ClassB.name

如何保护基本字段';s公共/私人

只是不发布字段,而是访问器:

public class ClassA
{
    private string _name;
    public string Name { get { return _name; } protected set { _name = value; } }
}
public class ClassB : ClassA
{
  /* nothing left to do - you can set Name in here but not from outside */
}

这是不可能的。不能更改基类字段的可见性。

假设您不能更改A,请不要使用继承,而是使用聚合和委派:

public class A {
  public string name;
  public int f() { return 42; }
}
public class B {
  private A a;
  public int f() { return a.f(); }
  public string getName() { return a.name; }
}

Carsten Konig的方法是一个好方法,这里有一个替代方法。

public class ClassA {
    public virtual string Name {
        get;
        private set;
    }
}
public class ClassB : ClassA {
    public override string Name {
        get {
            return base.Name;
        }
    }
}

嗯。这有两个窍门。但它们都不是你真正想要的。一种是:

    public class ClassA 
    {
        protected string name;
        public string Name { get { return name; } public set { name = value; } }
    }
public class ClassB : ClassA
    {
         public new string Name { get { return base.name; } }
    }

如果你不能控制ClassA,你可以这样做:

void Main()
{   
    var b = new ClassB();
    var a = (ClassA)b;
    a.name = "hello";
    b.PrintName();
}
class ClassA {
    public string name;
}
class ClassB : ClassA  {
    private new string name;
    public void PrintName() {
        Console.WriteLine(base.name);
    }
}