Как защитить публичное / частное владение базовым полем - PullRequest
2 голосов
/ 26 сентября 2011

Если у меня есть 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 ]

6 голосов
/ 26 сентября 2011

просто не публикуйте поле, а методы доступа:

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 голос
/ 26 сентября 2011

Это невозможно.Вы не можете изменить видимость поля базового класса.

0 голосов
/ 26 сентября 2011

Hm. Для этого есть пара хитростей. Но ни один из них не является тем, что вы действительно хотите. Один из них:

    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; } }
    }
0 голосов
/ 26 сентября 2011

Метод Карстена Кенига - хороший способ, и вот альтернатива.

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

public class ClassB : ClassA {
    public override string Name {
        get {
            return base.Name;
        }
    }
}
0 голосов
/ 26 сентября 2011

Если у вас нет контроля над 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);
    }
}
0 голосов
/ 26 сентября 2011

Если вы не можете изменить 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...