2011-09-26 70 views
2

如果我有一个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作为私有字段。 因此,如果我创建类型为的对象类BClassB.name无法修改。

+0

你确定你想要两个同名的字段吗?如果只有ClassA和ClassB可以访问ClassA,那么不会有助于声明ClassA中的名称吗? –

+0

@Davide Piras肯定,因为ClassA.name应该是可见的,而不是验证,但在ClassB.name是我的关注我应该使它私人。 – Burimi

+2

不作领域进行的公共 - 糟糕的设计 – Carsten

回答

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

但在ClassA的名称是不是真正的“公”的 - 你不能ClassA和ClassB的外部改变它的值:(( – Vasya

+1

@ Prator12也不应你,如果你让名称中的A类多变,你可以做百达类似' ((ClassA)objectB).Name =“and it is setable”;' – Carsten

1

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

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; } 
} 
-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); 
    } 
} 
+0

这不仅仅是一个印刷问题 – Burimi

+0

这是'new'关键字是解决方案,这隐藏了以前的公共领域。 –

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