好的,所以我承认这是有点棘手......但它确实有逻辑作用。我正在使用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"
};
}
有关为什么这不起作用以及绕过它的方法的任何想法?
答案 0 :(得分:8)
你有什么理由不能使用虚拟财产吗?这将提供您正在寻找的功能。它不会是一个领域。
protected abstract string[] array { get; }
...
protected override string[] array { get { return new string[]{"...","..."}; }}
答案 1 :(得分:1)
为什么需要覆盖变量?从你的代码看,只需设置值就足够了,不是吗?
另外,静态变量与类(不是实例)绑定,因此在任何情况下都不能覆盖。
答案 2 :(得分:1)
根本不要使用新的。在子类的构造函数中设置数组。
编辑:代码:
class subclass1 : baseclass
{
public subclass1()
{
array = new string[]
{
"class1value1",
"class1value2",
"class1value3",
"class1value4"
};
}
}
class subclass2 : baseclass
{
public subclass2()
{
array = new string[]
{
"class2value1",
"class2value2",
"class2value3",
"class2value4"
};
}
}
答案 3 :(得分:1)
class BaseClass
{
public virtual string Method()
{
return string.Empty;
}
}
abstract class BaseClass<T> : BaseClass where T : BaseClass<T>
{
protected static string[] strings;
public override string Method()
{
return string.Join(" ", strings);
}
}
class Subclass1 : BaseClass<Subclass1>
{
static Subclass1()
{
strings = new[] { "class1value1", "class1value2", "class1value3" };
}
}
class Subclass2 : BaseClass<Subclass2>
{
static Subclass2()
{
strings = new[] { "class2value1", "class2value2", "class2value3" };
}
}
重要的部分是泛型参数T
,它基本上作为字符串数组的索引。
答案 4 :(得分:1)
您正在尝试从数组中获取多态行为,但您要为类本地行为定义它。
数组必须是虚拟的,或者基类中的method()将编译为始终访问基类中的数组 - 数组也应该是属性而不是字段来执行此操作,即
string [] _array = {...}; / base class local values protected virtual string [] array {get {return _array; }} //使数组属性可覆盖
然后在子类中,你需要做
string [] _array = {...}; //子类本地值 virtual string [] array {get {return _array;这将覆盖基类属性
以获得理想的效果