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; 这会覆盖基类属性
为了获得理想的效果