如何保护基地的公共/私人

时间:2011-09-26 07:22:06

标签: c# oop inheritance

如果我有 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

6 个答案:

答案 0 :(得分:6)

只是不发布字段而是发布者:

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 */
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

假设您无法更改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; }
}

答案 3 :(得分:0)

Carsten Konig的方法是一种很好的方法,这是一种替代方法。

public class ClassA {
    public virtual string Name {
        get;
        private set;
    }
}

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

答案 4 :(得分:0)

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

    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; } }
    }

答案 5 :(得分:-1)

如果您无法控制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);
    }
}
相关问题