如果我有 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
。
答案 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);
}
}