C#基类方法使用的成员变量覆盖

好的,所以我承认这是有点棘手……但它确实有逻辑作用。 我正在使用C#作为当前项目,我试图找到一种方法来覆盖派生类中的成员变量,但是在基类方法中访问重写的变量。 为了使事情更“有趣”,最好是被覆盖的成员变量是静态的(这在下面的示例代码中没有显示)。

这是我的示例代码:

class baseclass { protected string[] array = null; public string method() { string str = ""; foreach (string x in this.array) { str += x + " "; } return str; } } class subclass1 : baseclass { new string[] array = new string[] { "class1value1", "class1value2", "class1value3", "class1value4" }; } class subclass2 : baseclass { new string[] array = new string[] { "class2value1", "class2value2", "class2value3", "class2value4" }; } 

有什么想法,为什么这不起作用,以及解决它的方法?

你有什么理由不能使用虚拟财产吗? 这将提供您正在寻找的function。 它不会是一个领域。

 protected abstract string[] array { get; } 

 protected override string[] array { get { return new string[]{"...","..."}; }} 

为什么需要覆盖变量? 从你的代码看,只需设置值就足够了,不是吗?

另外,静态变量与类(不是实例)相关联,因此在任何情况下都不会被覆盖。

根本就不要使用新的。 在子类的构造函数中设置数组。

编辑:代码:

 class subclass1 : baseclass { public subclass1() { array = new string[] { "class1value1", "class1value2", "class1value3", "class1value4" }; } } class subclass2 : baseclass { public subclass2() { array = new string[] { "class2value1", "class2value2", "class2value3", "class2value4" }; } } 
 class BaseClass { public virtual string Method() { return string.Empty; } } abstract class BaseClass : BaseClass where T : BaseClass { protected static string[] strings; public override string Method() { return string.Join(" ", strings); } } class Subclass1 : BaseClass { static Subclass1() { strings = new[] { "class1value1", "class1value2", "class1value3" }; } } class Subclass2 : BaseClass { static Subclass2() { strings = new[] { "class2value1", "class2value2", "class2value3" }; } } 

重要的部分是通用参数T ,它基本上用作字符串数组的索引。

您正在尝试从数组中获取多态行为,但您要为类本地行为定义它。

数组必须是虚拟的,或者基类中的method()将编译为始终访问基类中的数组 – 数组也应该是属性而不是字段来执行此操作,即,

string [] _array = {…}; / base class local values protected virtual string [] array {get {return _array; } //使数组属性可以覆盖

然后在子类中,你需要做

string [] _array = {…}; //子类本地值virtual string [] array {get {return _array; 这会覆盖基类属性

为了获得理想的效果